我使用 Service
调用创建浮动窗口,该窗口会浮在其他所有视图/活动之上。这个窗口有自己的 Activity
,与对话框不同。
现在我想给这个窗口添加一个拖放(Drag&Drop)操作,例如,如果您长按浮动窗口中的一个 ImageView
,则可以将其拖放到另一个 Activity
(或基本 Activity)中。我一直在尝试使用 OnLongClickListener
触发拖动事件,并添加了 OnDragListener
来捕获放置事件。以下是我目前为止的代码:
public class MyFloatableActivity extends FloatActivity {
private ImageView mImg;
private MyDragEventListener mDragListen;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.float_activity));
// This imageView is for Drag&Drop test
mImg = (ImageView)findViewById(R.id.drag_img));
mImg.setOnLongClickListener(new ImageView.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData dragData = ClipData.newPlainText("dragtext", "dragtext");
v.startDrag(dragData, new View.DragShadowBuilder(v), null, 0);
return false;
}
});
mImg.setOnDragListener(mDragListen);
switchToFloat(); // Make this activity to float
}
MyDragEventListener类是:
public class MyDragEventListener implements View.OnDragListener {
private ClipData mDragData;
@Override
public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
ImageView img;
if(v instanceof ImageView) {
img = (ImageView)v;
} else{
return false;
}
switch(action) {
case DragEvent.ACTION_DRAG_STARTED:
if(event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
Log.d("DDD", "Drag started!!!");
return true;
}else {
return false;
}
case DragEvent.ACTION_DRAG_ENTERED:
Log.d("DDD", "Entered!!!");
case DragEvent.ACTION_DRAG_LOCATION:
case DragEvent.ACTION_DRAG_EXITED:
return true;
case DragEvent.ACTION_DRAG_ENDED:
case DragEvent.ACTION_DROP:
Log.d("DDD", "Action drop!!!");
return true;
}
return true;
}
我实现OnDragListener
的原因是为了在基础活动中监听ACTION_DROP
事件,当ImageView
被放置时。这使我能够确定ImageView是放置在目标图像上还是布局上。以下是我的基础活动:
public class DragAndDropDemo extends Activity {
private ImageView mImg;
private MyDragEventListener mDragListen;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drag_and_drop);
//findViewById(R.id.drag_layout).setOnDragListener(mDragListen);
mImg = (ImageView)findViewById(R.id.dest_img);
mImg.setOnDragListener(mDragListen);
}
问题是在
DragAndDropDemo
中的 OnDragListener
没有被调用,因此我无法在我的基本 Activity 中捕获 Drop 事件。我看过很多拖放的例子,但从来没有得到正确的解决方案。我想知道在 Android 中是否可以将 Drag & Drop 事件抛给不同的 Activity。如果 Android 可以做到,那将是什么呢?有人能帮忙吗?