【问题标题】:DragShadowBuilder Not working in Android 11DragShadowBuilder 在 Android 11 中不工作
【发布时间】:2021-09-04 16:52:10
【问题描述】:

在两个安卓模拟器上运行这个简单的代码: 像素 4 API 30, 像素 4 API 28

当我在 API 30 模拟器上长按图像视图时,视图会按照预期变得不可见,但视图阴影直到我在长按后开始拖动或移动时才可见,而它在 API 28 模拟器上工作正常。我尝试添加 startDragAndDrop,因为 startDrag 已被弃用(因此显示 Gradle 警告)但问题仍然存在。

如果有需要,我可以分享问题的视频。

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.myimage4);
        imageView.setOnLongClickListener(new MyLongClickListener());
    }

    private final class MyLongClickListener implements View.OnLongClickListener {

        @Override
        public boolean onLongClick(View view) {
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            // Start the drag of the shadow
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                view.startDragAndDrop(null, shadowBuilder, view, 0);
            } else {
                view.startDrag(null, shadowBuilder, view, 0);
            }

            // Hide the actual view as shadow is being dragged
            view.setVisibility(View.INVISIBLE);
            return true;
        }
    }
}

【问题讨论】:

    标签: android drag-and-drop draggable drag


    【解决方案1】:

    好的,我找到了一种解决方法(在 Pixel 2 API 30 模拟器上进行了测试,但没有在其他任何模拟器上测试过)。这个想法是推迟隐藏被拖动的视图,直到拖动开始。因此,我将视图隐藏在 View.OnDragListener 中。以下是该类的一些代码:

    private int mStartedAtX = -99;
    private int mStartedAtY = -99;
    private boolean mMoved = false;
    
    private void onDragPageItem(DragEvent dragEvent)  {
        int dragAction = dragEvent.getAction();
    
        // On drag started...
        if (dragAction == DragEvent.ACTION_DRAG_STARTED) {
            mStartedAtX = (int)dragEvent.getX();
            mStartedAtY = (int)dragEvent.getY();
        }
    
        // On drag exit...
        else if (dragAction == DragEvent.ACTION_DRAG_EXITED) {
            mPageAdmin.handleItemDragExit();
        }
    
        // On drag motion...
        else if (dragAction == DragEvent.ACTION_DRAG_LOCATION) {
            int draggedToX = (int)dragEvent.getX();
            int draggedToY = (int)dragEvent.getY();
            mPageAdmin.handleItemDragMove(draggedToX, draggedToY);
    
            if (!mMoved) {
                handleFirstMove(draggedToX, draggedToY);
            }
        }
    
        // On drag drop...
        else if (dragAction == DragEvent.ACTION_DROP) {
            setDragInProgress(false);
            mPageAdmin.handleItemDragDrop();
            resetMovedFields();
        }
    
        // On drag end...
        else if (dragAction == DragEvent.ACTION_DRAG_ENDED) {
            setDragInProgress(false);
            mPageAdmin.handleItemDragEnd();
            resetMovedFields();
        }
    }
    
    private void handleFirstMove(int locX, int locY) {
        if ((locX != mStartedAtX) || (locY != mStartedAtY)) {
            View draggingView =  mPageAdmin.getItemTouchListener().getTouchedView();
            if (draggingView != null) {
                draggingView.setVisibility(View.GONE);
            }
            mMoved = true;
        }
    }
    
    private void resetMovedFields() {
        mStartedAtX = -99;
        mStartedAtY = -99;
        mMoved = false;
    }
    

    handleFirstMove() 方法是隐藏视图的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2014-08-30
      • 2011-05-30
      • 2021-11-21
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多