【问题标题】:Android Drag and Drop. Positioning image after dragging安卓拖放。拖动后定位图像
【发布时间】:2013-12-04 18:38:10
【问题描述】:

当我拖动 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

【问题讨论】:

    标签: android drag-and-drop imageview android-relativelayout


    【解决方案1】:

    替换

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

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

    【讨论】:

    • 我做到了。早期的 ImageView 插入到下方和右侧,现在就在下方。
    • 所有职位都会发生这种情况吗?您的视图宽度、高度和 x,y 是多少
    • 添加了日志!查看 72*72 标准安卓图标
    • 根据代码,它工作正常。你有什么问题?你怎么能说“就在下面”——你的 drop y 位置是 390,你的 view y 位置是 354。你是说 390 和 354 是一样的吗?
    • 如果您想更清楚地看到更改,请尝试使用大尺寸图像图标的代码。您现在可以看到区别了。
    【解决方案2】:

    这是因为它将图像的左上角放置在您想要的位置。

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

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

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

    【讨论】:

    • 感谢您的澄清
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      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放在中间 快乐编程:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多