拖动开始时我尝试增加图像的阴影 我创建了自定义dragshadowbuilder并将大小增加了一倍,但没有任何事情发生。
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);
}}
是什么原因?
答案 0 :(得分:17)
嗯,这在文档中并不是那么清楚。我正在使用给定的构建器来减小大小,你只需要通过乘以你的条件来改变除法;
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);
}
}
答案 1 :(得分:1)
这是Nande答案的简化Kotlin版本。
阴影构建器代码:
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)
}
}
用法:
// 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)