gpt4 book ai didi

android - 如何在 Android 中使用拖放来交换两个 ImageView ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:58:57 25 4
gpt4 key购买 nike

我一直在尝试在 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 在目标上有效,但在拖动时无效,我将不胜感激。

最佳答案

从事计​​算机科学的最大乐趣之一就是学习谦逊。至少 90% 的时间,问题的答案是:“为什么这不起作用?”是你告诉计算机做错事了。

在“case DragEvent.ACTION_DROP:”中,我得到了对两个 View 的引用。出于某种原因我没有意识到的是,当我这样做的时候

target.setImageDrawable(dragged.getDrawable());

我还更改了 temp 的可绘制对象,因为 temp 指的是实际 View 。因为当我这样做的时候

dragged.setImageDrawable(temp.getDrawable());

我实际上只是将 dragged 的​​ drawable 设置为原来的样子。这是更正后的代码。

            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;

关于android - 如何在 Android 中使用拖放来交换两个 ImageView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com