通过触摸对象下方拖动视图并相应地移动



我已经在Android中创建了一个简单的拖放应用程序。但是现在我想在X轴上移动视图而不触摸视图本身。该视图应从屏幕上的任何地方移动用户触摸了屏幕。我可以实现此效果。

目前,我正在使用本教程进行拖放操作。我已经在父视图上应用了OnTouchListner。但是我认为这不是一个好主意。请任何人都可以建议我做正确的方法。

这是我的代码

 rel.setOnTouchListener(this);
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                dX = v.getX() - event.getRawX();
                dY = v.getY() - event.getRawY();
                lastAction = MotionEvent.ACTION_DOWN;
                break;
            case MotionEvent.ACTION_MOVE:
                v.setY(event.getRawY() + dY);
                v.setX(event.getRawX() + dX);
                lastAction = MotionEvent.ACTION_MOVE;
                break;
            case MotionEvent.ACTION_UP:
                if (lastAction == MotionEvent.ACTION_DOWN)
                    Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show();
                break;
            default:
                return false;
        }
        return true;
    }

我的XML代码是

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rel"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ImageView
            android:id="@+id/ball"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ball" />
</RelativeLayout>

正如我所评论的,我写的是答案可能是帮助某人。此代码将在x轴上移动视图

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            dX = v.getX() - event.getRawX();
            dY = v.getY() - event.getRawY();
            lastAction = MotionEvent.ACTION_DOWN;
            break;
        case MotionEvent.ACTION_MOVE:
           //remove this v.setY() line
            v.setX(event.getRawX() + dX);
            lastAction = MotionEvent.ACTION_MOVE;
            break;
        case MotionEvent.ACTION_UP:
            if (lastAction == MotionEvent.ACTION_DOWN)
                Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show();
            break;
        default:
            return false;
    }
    return true;
}

最后,通过对我的代码进行一些更改解决了这个问题。希望这将帮助某人实现此效果。

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            dx = v.getX() - event.getRawX();
            dy = v.getY() - event.getRawY();
            ball_dx = ball.getX();
            lastAction = MotionEvent.ACTION_DOWN;
            break;
        case MotionEvent.ACTION_MOVE:
            //  ball.setY(event.getRawY() + dy);
            if ((event.getRawX() + dx + ball_dx) < screenwidth - 80 && (event.getRawX() + dx + ball_dx) > 10)
                ball.setX(event.getRawX() + dx + ball_dx);
            lastAction = MotionEvent.ACTION_MOVE;
            break;
        case MotionEvent.ACTION_UP:
            if (lastAction == MotionEvent.ACTION_DOWN)
                Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show();
            break;
        default:
            return false;
    }
    return true;
}

最新更新