首页 > 解决方案 > 有没有办法在没有接触点进入视图边界的情况下处理拖放?

问题描述

我正在开发 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();
    }

标签: androiddrag-and-drop

解决方案


推荐阅读