Кинетический перевод по оси Y с использованием FlingAnimation

Я пытаюсь добавить "кинетическое" перемещение по оси Y из верхней части экрана в нижнюю (и наоборот) в пользовательский макет, отображаемый над всеми приложениями с помощью диспетчера окон.

Я пытался сделать это таким образом:

private void animateFlingInYAxis(View view) {
        FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_Y);
        fling.setStartValue(0.9F);
        fling.setStartVelocity(0f);
        //fling.setMinValue(0.5F);
        fling.setFriction(0.2F);
        fling.start();
}

Но следующий результат не работает правильно. Я пытался изменить значения SCROLL_Y в TRANSLATION_Y и установить пользовательский диапазон значений, но без удачи.

Действие обрабатывается в ACTION_MOVE событие таким образом:

case MotionEvent.ACTION_MOVE:
                params.y = initialY + (int) (event.getRawY() - initialTouchY);
                if(isMovingInYAxis((int) initialTouchY ,(int) event.getRawY())) {
                    windowManager.updateViewLayout(view, params);
                    animateFlingInYAxis(view);
                }
                break;

Я хотел бы спросить, как правильно анимировать движение по оси Y?

Большое спасибо за любые советы.

Edit1: после настройки setStartVelocity(2000); кажется, работает лучше, но вид частично скрывается (см. скриншот ниже).

Edit2: я реализовал GestureDetector.OnGestureListener в пользовательском представлении, теперь я могу ловить события броска и прокрутки. В методе onFling я могу распознать направление движения (TOP_BOTTOM, BOTTOM_TOP), но я не могу сделать анимацию просмотра данного направления.

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Logger.d("onFling");
        if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            Logger.d("Bottom to top");
            animateFlingInYAxis(view, "BOTTOM_TOP");
            return false; // Bottom to top
        }  else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            Logger.d("Top to bottom");
            animateFlingInYAxis(view, "TOP_BOTTOM");
            return false; // Top to bottom
        }
        return false;
    }



private void animateFlingInYAxis(View view, String type) {

        FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.TRANSLATION_Y);
        if(type.equals("BOTTOM_TOP")) {
            fling.setStartValue(100); //WHICH PARAMS TO PASS?
            fling.setMinValue(480); //WHICH PARAMS TO PASS?
            fling.setMaxValue(0); //WHICH PARAMS TO PASS?
        } else{
            fling.setStartValue(470);
            fling.setMinValue(480);
            fling.setMaxValue(0);
        }
        fling.setStartVelocity(2000);
        fling.setFriction(0.8F);
        fling.start();

0 ответов

Другие вопросы по тегам