【问题标题】:Drag and Drop in Android: How to get the new position of a dropped ViewAndroid中的拖放:如何获取已放置视图的新位置
【发布时间】:2016-01-10 21:33:23
【问题描述】:

您好,我有一个简单的拖放活动。它看起来像这样:

public class Test extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    findViewById(R.id.myimage1).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage2).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage3).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.myimage4).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.one).setOnDragListener(new MyDragListener());
    findViewById(R.id.two).setOnDragListener(new MyDragListener());
    findViewById(R.id.three).setOnDragListener(new MyDragListener());
    findViewById(R.id.four).setOnDragListener(new MyDragListener());
}


//TEST DRAG AND DROP

private final class MyTouchListener implements View.OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }
}

class MyDragListener implements View.OnDragListener {
    Drawable enterShape = getResources().getDrawable(R.drawable.shape_droptarget);
    Drawable normalShape = getResources().getDrawable(R.drawable.shape);

    @Override
    public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                // do nothing
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                v.setBackgroundDrawable(enterShape);
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                v.setBackgroundDrawable(normalShape);
                break;
            case DragEvent.ACTION_DROP:
                // Dropped, reassign View to ViewGroup
                View view = (View) event.getLocalState();
                ViewGroup owner = (ViewGroup) view.getParent();
                owner.removeView(view);
                LinearLayout container = (LinearLayout) v;
                container.addView(view);
                view.setVisibility(View.VISIBLE);
                break;
            case DragEvent.ACTION_DRAG_ENDED:
                v.setBackgroundDrawable(normalShape);
            default:
                break;
        }
        return true;
    }
}

}

现在我想了解一下 Views onClick 的新位置。我需要一个 int 。可能是这样的:如果图片一在布局一中,则 int 为:“11”,如果图片二在布局三中,则 int 为“23”。我需要所有 4 张图片的位置,所以我需要 4 个 int。

但我不知道,如何获得新职位。我很感谢任何帮助!

【问题讨论】:

    标签: java android drag-and-drop draggable


    【解决方案1】:

    onClick被触发时,可以简单的调用int indexOfChild(View)获取子视图位置:

    @Override
    public void onClick(View v) {
        int position = parentContainer.indexOfChild(v);
    }
    

    然后,通过为每个小部件的图像添加特定标签。您将能够将您的 int 构造为 imageTag + position,例如:

    @Override
    public void onClick(View v) {
        String imageTag = v.getTag();
        int position = parentContainer.indexOfChild(v);
    
        int resultValue = Integer.parseInt(imageTag) + position;
    }
    

    【讨论】:

    • 我已经得到了答案。我只需要检查当前拖动的视图和布局。那么我只需要一些 if 函数,仅此而已,谢谢 :)
    • 然后,@PatrickCzerwinski 发布您自己的答案。也许我的不适合您的需求。您可以发布自己的并接受它,没有坏处;)
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多