Android拖放。拖动后定位图像

时间:2013-12-04 18:38:11

标签: android drag-and-drop imageview relativelayout

当我拖动ImageView时,它不会放在我放开手指的地方。它位于右下方。我不明白什么是错的。

尝试了ImageView定位结果的各种选项是相同的

布局

<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/center"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF8989"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            findViewById(R.id.imageView1).setOnTouchListener(this);
            findViewById(R.id.imageView1).getRootView().setOnDragListener(this);
        }

public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(null, shadowBuilder, view, 0);
        view.setVisibility(View.INVISIBLE);
        return true;
    } else {
        return false;
    }
}

public boolean onDrag(View v, DragEvent event) {

    switch (event.getAction()) {
        case DragEvent.ACTION_DROP:

        float X = event.getX();
        float Y = event.getY();

        Log.d(LOGCAT, "X " + (int) X + "Y " + (int) Y);
        View view = (View) event.getLocalState();
        view.setX(X);
        view.setY(Y);
        view.setVisibility(View.VISIBLE);

    default:
        break;
    }
    return true;
} 

logcat的

12-04 23:44:40.548: D/myLogs(32658): Width image 72 Height image 72
12-04 23:44:40.558: D/myLogs(32658): ACTION_DROP X 216Y 390
12-04 23:44:40.568: D/myLogs(32658): Real position: X 180.0Y 354.0
12-04 23:44:40.598: D/myLogs(32658): Drag ended
12-04 23:44:41.928: D/myLogs(32658): Width image 72 Height image 72
12-04 23:44:41.928: D/myLogs(32658): ACTION_DROP X 442Y 329
12-04 23:44:41.948: D/myLogs(32658): Real position: X 406.0Y 293.0
12-04 23:44:41.968: D/myLogs(32658): Drag ended

4 个答案:

答案 0 :(得分:8)

替换

view.setX(X);
view.setY(Y);

view.setX(X-(view.getWidth()/2));
view.setY(Y-(view.getHeight()/2));

答案 1 :(得分:3)

这是因为它将图像的左上角放在你发布的地方。

要让它做你想做的事,基本上你需要从X中减去图像宽度的一半,从Y中减去一半的高度。

所以你应该有这样的东西:

view.setX((X - (image.width / 2));
view.setY(Y - (image.width / 2));

答案 2 :(得分:0)

v.setX(me.getRawX() - (v.getWidth()/ 2));

v.setY(me.getRawY() - (float)(v.getHeight()* 1.5 / 2));

我发现这个解决方案是从对象中心拖动的完美答案。

答案 3 :(得分:0)

只是因为有人需要帮助: 我试过它,发现问题出在rootview上,如果你给你的布局一个id(你正在移动图像的那个)而不是重新发布

findViewById(R.id.imageView1).getRootView().setOnDragListener(this);    
findViewById(R.id.imageView1).getRootView().findViewById(R.id.yourLayout).setOnDragListener(this);     

应该这样做。
将imageView置于中间尝试别人已经说过的话:

view.setX(X - iv.getWidth()/2);
view.setY(Y - iv.getHeight()/2) ;

这会将imageView放在中间 快乐编程:)