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

时间:2016-12-27 06:14:15

标签: android drag-and-drop

我在android.But中创建了一个简单的拖放应用程序现在我想在x轴上移动视图而不触及视图本身。视图应该从用户触摸屏幕的屏幕上的任何位置移动。我怎么能达到这个效果。

目前我正在使用this教程进行拖放操作。我在父视图上应用了OnTouchListner。但我认为这不是一个好主意。请允许任何人建议我这样做的正确方法。< / p>

这是我的代码

 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>

2 个答案:

答案 0 :(得分:0)

正如我评论的那样,我写的是答案可能对某人有帮助。这段代码只会在X轴上移动视图

.dump

答案 1 :(得分:0)

最后,通过对我的代码进行一些更改来解决此问题。希望这有助于实现此效果的人。

@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;
}