Как поменять местами два вида изображений с помощью перетаскивания в Android?


Я пытался реализовать очень простое перетаскивание в Android, где перетаскиваемый элемент меняет позиции с элементом, на который он был брошен.

Я успешно реализовал слушателей onLongClick и onDrag. Когда я перетаскиваю элемент, он заменяет элемент, на который он был брошен, но я не могу понять, как заставить замененный элемент занять место перетаскиваемого элемента.

Я потратил некоторое время на поиск ответов, но большинство ответов просто связаны сложными реализациями перетаскивания и падение включало много файлов с большим количеством кода, и я не был в состоянии понять их достаточно, чтобы применить их к моему коду.

Я изначально предполагал, что не получу истинную копию ImageView с

ImageView temp = (ImageView) event.getLocalState();

Поэтому я попробовал

ImageView dragged = (ImageView) findViewById(temp.getId());  
Но это не имело значения. Я почти уверен, что проблема в "OnDragListener", в "case DragEvent".ACTION_DROP:'. Вот мой код (от Main.java):
public class Main extends ActionBarActivity {

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

        findViewById(R.id.ball1).setOnLongClickListener(listenClick);
        findViewById(R.id.ball1).setOnDragListener(listenDrag);
        findViewById(R.id.target1).setOnLongClickListener(listenClick);
        findViewById(R.id.target1).setOnDragListener(listenDrag);
        findViewById(R.id.target2).setOnDragListener(listenDrag);
        findViewById(R.id.target2).setOnLongClickListener(listenClick);
        findViewById(R.id.target3).setOnDragListener(listenDrag);
        findViewById(R.id.target3).setOnLongClickListener(listenClick);



View.OnLongClickListener listenClick = new View.OnLongClickListener()
    {
        @Override
        public boolean onLongClick(View v)
        {

            ClipData data = ClipData.newPlainText("","");
            DragShadow dragShadow = new DragShadow(v);

            v.startDrag(data, dragShadow, v, 0);

            return false;
        }
    };

    private class DragShadow extends View.DragShadowBuilder
    {
        ColorDrawable greyBox;

        public DragShadow(View view)
        {
            super(view);
            greyBox = new ColorDrawable(Color.LTGRAY);
        }

        @Override
        public void onDrawShadow(Canvas canvas)
        {
            greyBox.draw(canvas);
        }

        @Override
        public void onProvideShadowMetrics(Point shadowSize,
                                           Point shadowTouchPoint)
        {
            View v = getView();

            int height = (int) v.getHeight();
            int width = (int) v.getWidth();

            greyBox.setBounds(0, 0, width, height);

            shadowSize.set(width, height);

            shadowTouchPoint.set((int)width/2, (int)height/2);
        }
    }



View.OnDragListener listenDrag = new View.OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event)
        {
            int dragEvent = event.getAction();

            switch (dragEvent)
            {
                case DragEvent.ACTION_DRAG_ENTERED:
                    Log.i("Drag Event", "Entered");
                    break;

                case DragEvent.ACTION_DRAG_EXITED:
                    Log.i("Drag Event", "Exited");
                    break;

                case DragEvent.ACTION_DROP:
                    ImageView target = (ImageView) v;

                    ImageView temp = (ImageView) event.getLocalState();
                    ImageView dragged = (ImageView) findViewById(temp.getId());


                    target.setId(dragged.getId());
                    target.setImageDrawable(dragged.getDrawable());

                    dragged.setId(temp.getId());
                    dragged.setImageDrawable(temp.getDrawable());

                    break;

            }

            return true;
        }
    };

Если кто-нибудь может сказать мне, почему setImageDrawable работает по цели, но не по волочению, буду очень благодарен.

1 4

1 ответ:

Одна из самых больших радостей пребывания в компьютерной науке-это научиться смирению. По крайней мере, в 90% случаев, ответ на вопрос: "почему это не работает?- то, что ты сказал компьютеру сделать что-то не так.

В " case DragEvent.ACTION_DROP: "я получал ссылки на обе точки зрения. Чего я по какой-то причине не понимал, так это того, что когда я это сделал

target.setImageDrawable(dragged.getDrawable());

Я также изменял рисуемый темп, так как темп имел в виду фактический вид. Из-за этого, когда я did

dragged.setImageDrawable(temp.getDrawable());

На самом деле я просто устанавливал drawable drawed таким, каким он был изначально. Вот исправленный код.

            case DragEvent.ACTION_DROP:
                ImageView target = (ImageView) v;

                ImageView dragged = (ImageView) event.getLocalState();

                Drawable target_draw = target.getDrawable();
                Drawable dragged_draw = dragged.getDrawable();

                dragged.setImageDrawable(target_draw);
                target.setImageDrawable(dragged_draw);

                break;