Android移动视图触摸事件

Man*_*oba 12 android touch ontouchlistener

我想在我的布局中移动两个不同的视图,以便用户可以像他的愿望一样显示它.

到目前为止,我已经制作了以下代码来处理触摸事件:

this.viewEvent.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event)
    {           
        final int y = (int) event.getRawY();

        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
        switch (event.getAction() & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
                element.setEventY(y - params.topMargin);
                break;

            case MotionEvent.ACTION_UP:
                viewGroup.invalidate();
                break;

            case MotionEvent.ACTION_POINTER_DOWN:
            case MotionEvent.ACTION_POINTER_UP:
                break;

            case MotionEvent.ACTION_MOVE:
                params.topMargin = y - element.getEventY();
                params.bottomMargin = screenHeight - view.getHeight() - params.topMargin;

                // Avoid out of screen
                if (params.topMargin < 0) return true;

                // Apply changes
                view.setLayoutParams(params);
                break;
        }

        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

element是处理位置的自定义对象的实例. screenHeightDisplay班级给出的屏幕高度.

我能够移动元素,但是当我触摸它时它会闪烁,一旦我把手指放上,视图就会消失.我甚至无法检索它,它只是在屏幕外.

我做错了什么?

谢谢你的帮助

Man*_*oba 19

使用以下代码执行简单的操作Touch to move:

layout_counter.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event)
        {
            if (currentState != State.EDIT_MOVE) return false;

            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
            if (view.getId() != R.id.layout_counter) return false;

            switch (event.getAction())
            {
                case MotionEvent.ACTION_MOVE:
                    params.topMargin = (int) event.getRawY() - view.getHeight();
                    params.leftMargin = (int) event.getRawX() - (view.getWidth() / 2);
                    view.setLayoutParams(params);
                    break;

                case MotionEvent.ACTION_UP:
                    params.topMargin = (int) event.getRawY() - view.getHeight();
                    params.leftMargin = (int) event.getRawX() - (view.getWidth() / 2);
                    view.setLayoutParams(params);
                    break;

                case MotionEvent.ACTION_DOWN:
                    view.setLayoutParams(params);
                    break;
            }

            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

layout_counter您要移动的视图在哪里.

别忘了把你的可移动元素放进去 FrameLayout

  • FrameLayout在这里非常重要.我整天都在使用相对布局试图弄清楚为什么我的图像视图中的一个是可拖动的,而其他人则显示触摸日志,但它们不会移动.. :(谢谢 (4认同)
  • 答案中的 State.EDIT_MOVE 和 currentState 是什么。你可以解释吗? (2认同)