Android 中的拖放:如何获得拖放视图的新位置
Drag and Drop in Android: How to get the new position of a dropped View
嗨,我得到了一个简单的拖放 activity。它看起来像这样:
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;
}
}
}
现在我想了解View onClick 的新位置。为此我需要一个整数。它可能是这样的:如果图片一在布局一中,则 int 为:“11”,如果图片二在布局 3 中,则 int 将为“23”。而我需要所有4张图片的位置,所以我需要4个int。
但我不知道,如何获得新职位。我感谢任何帮助!
当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;
}
嗨,我得到了一个简单的拖放 activity。它看起来像这样:
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;
}
}
}
现在我想了解View onClick 的新位置。为此我需要一个整数。它可能是这样的:如果图片一在布局一中,则 int 为:“11”,如果图片二在布局 3 中,则 int 将为“23”。而我需要所有4张图片的位置,所以我需要4个int。
但我不知道,如何获得新职位。我感谢任何帮助!
当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;
}