拖动时ImageView无法正确移动

时间:2019-08-20 15:33:33

标签: android touch-event

基本上我有这段代码,可以水平拖动imageView,直到我释放并尝试再次移动它为止,它仍然可以正常工作,它并没有真正跟随我的触摸,它只是出现在触摸之前,或者只是出现在我碰到的地方没有拖动。

 micImage.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {
                        final int x = (int) motionEvent.getRawX();
                        final int y = (int) motionEvent.getRawY();

                        switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {

                            case MotionEvent.ACTION_DOWN:
                                RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams)
                                        view.getLayoutParams();


                                xDelta = x - lParams.leftMargin;
                                yDelta = y - lParams.topMargin;

                                startRecording();

                                break;

                            case MotionEvent.ACTION_UP:

                                break;

                            case MotionEvent.ACTION_MOVE:
                                RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
                                        .getLayoutParams();
                                layoutParams.leftMargin = 0;
                                layoutParams.topMargin = 0;
                                layoutParams.rightMargin =  xDelta - x;
                                layoutParams.bottomMargin =  yDelta - y;
                                view.setLayoutParams(layoutParams);
                                break;

                        }

                        mainLayout.invalidate();
                        return true;
                    }
                });

我希望imageView正确地跟随我的手指,谢谢!

1 个答案:

答案 0 :(得分:0)

这是获得相同结果的简单得多的方法:

micImage.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                xDelta = view.getX() - event.getRawX();
                yDelta = view.getY() - event.getRawY();
                startRecording();
                break;
            case MotionEvent.ACTION_MOVE:
                view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
                break;
            default:
                return false;
            }
       return true;
    }
});

我不确定100%,但是我相信您的问题是由于未将默认布尔值设置为false引起的。


编辑:在评论中回答问题。

您可以通过执行以下操作来实现: (我尚未对此进行测试,但应该可以。)

int originalX = micImage.getX();
int originalY = micImage.getY();

micImage.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                xDelta = view.getX() - event.getRawX();
                yDelta = view.getY() - event.getRawY();
                startRecording();
                break;
            case MotionEvent.ACTION_MOVE:
                view.animate().x(event.getRawX() + xDelta).y(event.getRawY() + yDelta).setDuration(0).start();
                break;
            case MotionEvent.ACTION_UP:
                view.animate().x(originalX).y(originalY).setDuration(0).start();
                break;
            default:
                return false;
            }
           return true;
    }
});