Как поменять местами два вида изображений с помощью перетаскивания в 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 ответ:
Одна из самых больших радостей пребывания в компьютерной науке-это научиться смирению. По крайней мере, в 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;