如何在Android中使用拖动阴影生成器移动整个视图? [英] How to move the entire view using drag shadow builder in android?
问题描述
现在,我在Android中使用拖动构建器类,我可以在视图之间交换数据。但是,我想交换整个视图而不是只是数据。有人可以帮我吗
Now, I am using a drag shadow builder class in Android and I can swap the data between views. But, I want to swap the entire view rather than just the data. Can anyone help me?
例如,如果我有4个TextViews,A,B,C,D和我想要从A移动到C,然后使用拖动阴影生成器我可以移动只有A到C中的数据。但是,我想将完整的textview从一个位置移动到另一个位置。如何实现?
For example, if I have 4 TextViews, A,B,C,D and I want move from A to C, then, using the Drag Shadow Builder I can move only data inside A to C. But, I want to move the complete textview from one position to another. How do I achieve it?
//这里我们声明在触摸监听器上聆听触摸事件
//Here we declare On touch Listener to listen to the touch events
View.OnTouchListener longListen = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK ) {
case MotionEvent.ACTION_DOWN: {
DragShadow ds = new DragShadow(v);
ClipData data = ClipData.newPlainText("","");
v.startDrag(data,ds,v,0);
return false;
}
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
};
//这里我们设置拖动监听器来监听事件的下降
// Here we set the drag listener to listen to the drop of the event
View.OnDragListener dropListener = new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
switch (dragEvent)
{
//case DragEvent
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DRAG_ENTERED :
break;
case DragEvent.ACTION_DRAG_ENDED:
break;
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DRAG_LOCATION:
break;
case DragEvent.ACTION_DROP:
View view = (View) event.getLocalState();
ViewGroup owner = (ViewGroup) view.getParent();
Button target = (Button) v;
String target_og = target.getText().toString();
Button dragged = (Button) event.getLocalState();
String dragged_og = dragged.getText().toString();
dragged.setText(target_og);
target.setText(dragged_og);
return true;
}
return true;
}
};
推荐答案
好的,所以你需要做的就是这个:
Ok, so what you need to do is something like this:
private class DragShadow extends View.DragShadowBuilder {
View greyBox;
public DragShadow(View view) {
super(view);
greyBox = view;
}
@Override
public void onDrawShadow(Canvas canvas) {
greyBox.draw(canvas);
}
@Override
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
View v = getView();
int height = v.getHeight();
int width = v.getWidth();
shadowSize.set(width, height);
shadowTouchPoint.set((width / 2), (height / 2));
}
}
View.OnLongClickListener longListen = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
DragShadow ds = new DragShadow(v);
ClipData data = ClipData.newPlainText("","");
v.startDrag(data,ds,v,0);
v.setVisibility(View.INVISIBLE);
return false;
}
};
View.OnDragListener dropListener1 = new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
switch (dragEvent)
{
case DragEvent.ACTION_DRAG_STARTED:
case DragEvent.ACTION_DRAG_ENTERED :
case DragEvent.ACTION_DRAG_LOCATION:
case DragEvent.ACTION_DRAG_ENDED:
case DragEvent.ACTION_DRAG_EXITED:
break;
case DragEvent.ACTION_DROP:
View dragged = (View) event.getLocalState();
LinearLayout owner = (LinearLayout) dragged.getParent();
int draggedPosition = owner.indexOfChild(dragged);
int targetPosition = owner.indexOfChild(v);
owner.removeView(dragged);
owner.removeView(v);
if (draggedPosition > targetPosition) {
owner.addView(dragged, targetPosition);
owner.addView(v, draggedPosition);
} else {
owner.addView(dragged, targetPosition - 1);
owner.addView(v, draggedPosition);
}
dragged.setVisibility(View.VISIBLE);
}
return true;
}
};
这篇关于如何在Android中使用拖动阴影生成器移动整个视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!