I try to increase shadow of image when dragging start
I created custom dragshadowbuilder and increase size double, but nothing happend.
public class ImageDragShadowBuilder extends View.DragShadowBuilder {
public ImageDragShadowBuilder(View v) {
super(v);
}
@Override
public void onProvideShadowMetrics(Point shadowSize, Point touchPoint) {
shadowSize.set(getView().getWidth()*2, getView().getHeight()*2);
touchPoint.set(getView().getWidth() / 2, getView().getHeight() / 2);
}}
What is the reason?
Well, this is not so clear in documentation. I'm using given builder for decrease size you just need to change division by multiply for your condition ;
private static class MyDragShadowBuilder extends View.DragShadowBuilder {
private Point mScaleFactor;
// Defines the constructor for myDragShadowBuilder
public MyDragShadowBuilder(View v) {
// Stores the View parameter passed to myDragShadowBuilder.
super(v);
}
// Defines a callback that sends the drag shadow dimensions and touch point back to the
// system.
@Override
public void onProvideShadowMetrics (Point size, Point touch) {
// Defines local variables
int width;
int height;
// Sets the width of the shadow to half the width of the original View
width = getView().getWidth() / 2;
// Sets the height of the shadow to half the height of the original View
height = getView().getHeight() / 2;
// Sets the size parameter's width and height values. These get back to the system
// through the size parameter.
size.set(width, height);
// Sets size parameter to member that will be used for scaling shadow image.
mScaleFactor = size;
// Sets the touch point's position to be in the middle of the drag shadow
touch.set(width / 2, height / 2);
}
@Override
public void onDrawShadow(Canvas canvas) {
// Draws the ColorDrawable in the Canvas passed in from the system.
canvas.scale(mScaleFactor.x/(float)getView().getWidth(), mScaleFactor.y/(float)getView().getHeight());
getView().draw(canvas);
}
}
Here's a simplified Kotlin version of Nande's answer.
Shadow builder code:
class ScaledDragShadow(view: View, private val scale: Float): DragShadowBuilder(view) {
override fun onProvideShadowMetrics(outShadowSize: Point?, outShadowTouchPoint: Point?) {
// calculate the scaled view's dimensions
val scaledWidth = (view.width * scale).toInt()
val scaledHeight = (view.height * scale).toInt()
// set the scaled shadow size
outShadowSize?.set(scaledWidth, scaledHeight)
// re-center the out touch point using the scaled dimensions
outShadowTouchPoint?.set(scaledWidth / 2, scaledHeight / 2)
}
override fun onDrawShadow(canvas: Canvas?) {
// scale the canvas so it can fit the scaled view
canvas?.scale(
scale,
scale
)
view.draw(canvas)
}
}
Usage:
// increase the drag shadow size by x2
view.startDrag(null, ScaledDragShadow(view, 2F), view, View.DRAG_FLAG_OPAQUE)
// decrease the drag shadow size by half
view.startDrag(null, ScaledDragShadow(view, 0.5F), view, View.DRAG_FLAG_OPAQUE)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With