使视图可以滑动和移动

时间:2014-03-01 17:15:07

标签: android

我目前正在使用此代码成功移动我的视图

public boolean onTouch(View view, MotionEvent event) {
        final int X = (int) event.getRawX();
        final int Y = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                xDelta = X - lParams.leftMargin;
                yDelta = Y - lParams.topMargin;
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                break;
            case MotionEvent.ACTION_POINTER_UP:
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
                layoutParams.leftMargin = X - xDelta;
                layoutParams.topMargin = Y - yDelta;
                layoutParams.rightMargin = -250;
                layoutParams.bottomMargin = -250;
                view.setLayoutParams(layoutParams);
                break;
        }
        root.invalidate();
        return true;
    }

如果我按下视图并移动我的手指,视图会跟随它,现在我想实现一个滑动手势,它应该像这样工作: 如果我从背景开始滑动并点击视图,我希望它根据滑动的方向(向上,向下,向左或向右)播放旋转动画。 我仍然希望保留移动视图的能力。

想象一下,我可以移动一枚硬币,如果我的手指晃动它,它会旋转360°

修改 以下是我的旋转视图代码的工作原理,但只有从视图内部开始旋转才能工作

public class OnSwipeTouchListener implements OnTouchListener {

    public final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx){
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }

    private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                    }
                } else {
                    if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}

1 个答案:

答案 0 :(得分:0)

您应该覆盖RelativeLayout中的OnTouch()并将MotionEvent传递给SimpleOnGestureListener。在那里你可以为除onFling()之外的所有方法返回false,在那里你检查第一个事件是否在你要旋转的视图之外,第二个事件是在你要旋转的视图内。如果事件不是,则返回false表示您没有处理事件,否则您旋转硬币并指示您通过返回true来处理触摸事件。

作为一个额外的观点,我不认为你应该将右边距和下边距设置为-250否则视图将延伸到RelativeLayout的右边缘和底边缘之后的250像素,当我希望你只想要它时分别延伸到视图的预期宽度和高度。