0

我正在尝试将 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_YTRANSLATION_Y并设置自定义值范围,但没有运气。

在 event 中处理 action 是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();

在此处输入图像描述

4

0 回答 0