Red*_*one 13 android drag-and-drop popup
我一直在研究Android的启动器应用程序,类似于nova启动器.我已经设置了OnItemLongClickListener和OnDragListener.当我长按一个图标时,会显示一个弹出窗口,其中包含"删除","更改图标"等菜单.下图显示了长按时打开弹出窗口的应用程序的进度.
问题是当弹出窗口打开时拖动工作但下降不起作用.一旦弹出窗口打开,我似乎无法记录x,y位置.同样,当执行drop时,logcat中会显示以下消息.
I/ViewRootImpl: Reporting drop result: false
Run Code Online (Sandbox Code Playgroud)
我的代码在OnDragListener中是这样的
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
switch (dragEvent)
{
case DragEvent.ACTION_DRAG_LOCATION:
//Open popup here; note: its opened only once. popup.show();
//Log.i("Position x : ", Float.toString(event.getX())); log x or y
/*code to detect x any y change amount and close the popup
once user drags the icon little further and app knows that
user is trying to drag instead of opening the popup
and hence close the popup. popup.dismiss();
*/
// other case like ACTION_DROP etx goes after this
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎弹出窗口打开后我无法记录x或y; 还无法运行确定操作是用于"拖动"还是"弹出打开"的代码.
那么我该如何解决这个问题呢?一旦任何拖动量足以知道用户想要拖动,我想关闭弹出窗口.如果没有停止拖动并仅显示弹出窗口.
编辑
我通过使用OnTouchListner和OnDragListner解决了popup的问题.下面显示了我的OnDragListner代码.
//bottomAppDrawer is a GridView
bottomAppDrawer.setOnDragListener(new View.OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
int dragEvent = event.getAction();
LinearLayout draggedItem = (LinearLayout) event.getLocalState(); //dragged LinearLayout
GridView targetItem = (GridView) v; /* How do i get this drop target as LinearLayout so that i can delete or swap data */
switch (dragEvent)
{
case DragEvent.ACTION_DRAG_LOCATION:
if(reset==false) {
dragPositionStart = event.getX();
reset= true;
}
if(Math.abs(dragPositionStart - event.getX())>=20) {
Log.i("Position close : ", Float.toString(dragPositionStart));
if(isPopupOpen) {
popupMenu.dismiss();
v.startDrag(data, dragShadow, itemView, 0);
Toast.makeText(mContext, "popup closed", Toast.LENGTH_SHORT).show();
isPopupOpen = false;
}
reset = false;
}
break;
case DragEvent.ACTION_DROP:
Toast.makeText(mContext, "drop" + Integer.toString(targetItem.getChildCount()), Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
现在问题是我正在获取放置目标"Gridview",因为我在"Gridview"中删除了LinearLayout.另外这个"LinearLayout是"Gridview"的孩子.我希望drop target在同一个"GridView"中成为另一个"LinearLayout".这样我就可以交换数据或重新排序.如下图所示.
使用 . 在 Gridview 中查找 LinerLayout(拖动)的位置targetItem.pointToPosition(..)。
使用以下代码滑动 LinerLayout:
int i =targetItem.pointToPosition((int)event.getX(), (int)event.getY());
int j = Integer.parseInt(event.getClipData().getItemAt(0).getText().toString());
Collections.swap(targetItem, i, j);//swap Linerlayout
Log.i(TAG, "Swapped " + i+ " with " + j);
Run Code Online (Sandbox Code Playgroud)
代码未经过测试。我希望它对你有帮助。:)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |