Кинетический перевод по оси 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();