android - 有没有办法在没有接触点进入视图边界的情况下处理拖放?
问题描述
我正在开发 android 中的拖放应用程序,其中一个视图可以拖放到另一个视图上。我正在使用
View.OnDragListener
和覆盖onDrag
方法来收听拖动事件。
只有当我的手指点(触摸点)进入可以处理下降的视图边界时,才会处理我的下降。我希望在拖动视图进入时处理放置,而不仅仅是在我的触摸点进入时处理。用更简单的术语来说,我希望在我的拖动阴影与视图的边界重叠时处理拖放。
有没有办法在android中做到这一点?
这是覆盖onDrag
的方法View.OnDragListener
@Override
public boolean onDrag(View view, DragEvent dragEvent) {
LinearLayout dragAndDropLayout = findViewById(R.id.layout_drag_n_drop);
ImageView actionBox = (ImageView) view;
int dragAction = dragEvent.getAction();
CardView parentCardView = (CardView) actionBox.getParent();
if (dragAction == DragEvent.ACTION_DRAG_STARTED) {
mMenuAdapter.removeMenu(draggedMenuText);
parentCardView.setCardBackgroundColor(Color.parseColor("#FF4081"));
dragAndDropLayout.setBackgroundColor(Color.LTGRAY);
performEnterAnimation(actionBox.getParent());
} else if (dragAction == DragEvent.ACTION_DRAG_ENDED) {
if (dropEventNotHandled(dragEvent)) {
mMenuAdapter.addMenuAt(draggedMenuText, 0);
}
parentCardView.setCardBackgroundColor(Color.parseColor("#3F51B5"));
dragAndDropLayout.setBackgroundColor(Color.TRANSPARENT);
((CardView) parentCardView.getParent()).setCardBackgroundColor(Color.TRANSPARENT);
updateActionBoxesAsPerPreferences();
} else if (dragAction == DragEvent.ACTION_DRAG_ENTERED) {
containsDraggable = true;
parentCardView.setCardBackgroundColor(Color.parseColor("#FF4081"));
((CardView) parentCardView.getParent()).setCardBackgroundColor(Color.LTGRAY);
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
vibrator.vibrate(VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE));
}
} else if (dragAction == DragEvent.ACTION_DRAG_EXITED) {
containsDraggable = false;
parentCardView.setCardBackgroundColor(Color.parseColor("#FF4081"));
dragAndDropLayout.setBackgroundColor(Color.LTGRAY);
((CardView) parentCardView.getParent()).setCardBackgroundColor(Color.TRANSPARENT);
} else if (dragAction == DragEvent.ACTION_DROP) {
if (containsDraggable) {
int oldIconResource = getIconResourceOfView(view);
String oldIconName = MenuAsset.getNameOf(oldIconResource);
CharSequence text = dragEvent.getClipData().getItemAt(0).getText();
if (text.equals("list_item")) {
updateSharedPreferences(view, draggedMenuText);
mMenuAdapter.removeMenu(draggedMenuText);
mMenuAdapter.addMenuAt(oldIconName, 0);
} else {
updateSharedPreferences(view, draggedMenuText);
if (text.equals("action_box_1")) {
updateSharedPreferences(mActionBox1, oldIconName);
performDropAnimation(mActionBox1);
} else if (text.equals("action_box_2")) {
updateSharedPreferences(mActionBox2, oldIconName);
performDropAnimation(mActionBox2);
} else if (text.equals("action_box_3")) {
updateSharedPreferences(mActionBox3, oldIconName);
performDropAnimation(mActionBox3);
}
}
updateActionBoxesAsPerPreferences();
performDropAnimation(actionBox);
}
}
return true;
}
private boolean dropEventNotHandled(DragEvent dragEvent) {
return !dragEvent.getResult();
}
解决方案
推荐阅读
- jquery - Jquery如果数组推送值中的变量
- javascript - Vuex 延迟提交/缓冲状态更改
- jquery - 在 Internet Explorer 中调试一行 JQuery
- cygwin - 无法在 cygwin 中使用命令“iconv”转换以下文件:“udhr_deu_1901.txt”(来源:https://unicode.org/udhr/d/udhr_deu_1901.txt)
- javascript - 将 http 流量发送到多个域的 HTTPS
- postgresql - Thingsboard 无法连接到外部数据库 postgresql 谷歌云
- c# - 如何仅使用组合来模拟虚拟方法?
- c# - C# PInvoke 传递出 unsigned char*
- regex - 正则表达式 - 到 https://www 的非子域子目录(https 或 http)
- python - 如何将多个列表存储到 python 中的文本文件中,然后随机选择一个?