IllegalStateException: drag shadow dimensions must be positive

Viewed 3134

https://developer.android.com/reference/android/view/View.DragShadowBuilder#public-constructors

When I use the second constructor outlined above - "View.DragShadowBuilder() Construct a shadow builder object with no associated View."

the following exception is raised: java.lang.IllegalStateException: Drag shadow dimensions must be positive

The second line of code here causes this for me:

public boolean onLongClick(View view) {
    view.startDragAndDrop(null, new View.DragShadowBuilder(), view, 0); 
    return true;
}

It occurs on Android 9 Pie only. I have tried it on previous Android versions with no problem. I created an issue on the Android issue tracker, but maybe someone here knows why it happens or how to resolve it.

In the meantime I am creating the new View.DragShadowBuilderView(view) with view being a transparent ImageView which stops the crash for now but I am not sure if it is the best solution.

2 Answers

There is no need to create a transparent view. Create a custom DragShadowBuilder

public class MyDragShadowBuilder extends View.DragShadowBuilder {

    @Override
    public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) {
        outShadowSize.set(1,1);
        outShadowTouchPoint.set(0,0);
    }
}

and replace new View.DragShadowBuilder() with new MyDragShadowBuilder().

If you don't want to create a new class you can use anonymous classes:

val shadowBuilder = object : View.DragShadowBuilder(view) {
        override fun onProvideShadowMetrics(outShadowSize: Point, outShadowTouchPoint: Point) {
            super.onProvideShadowMetrics(outShadowSize, outShadowTouchPoint)
            outShadowSize.set(width, height)
            outShadowTouchPoint.set(xPoint, yPoint)
        }
    }

You can put xPoint and yPoint as use touch point values:

    val xPoint = event.x
    val yPoint = event.y
Related