安卓拖影生成器阴影大小

9

当拖动开始时,我尝试增加图像的阴影。
我创建了自定义的拖动阴影生成器并将大小增加了一倍,但什么也没有发生。

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);

}}

什么是原因?
2个回答

22

嗯,这在文档中并不是很清楚。我正在使用给定的构建器来减小大小,你只需要为你的条件更改除法为乘法即可。

好的,文档并没有说得很清楚。我正在使用给定的构建器以减小大小,您只需将除法更改为乘法以适应您的情况;

    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);
        }

    }

我的更改大小和调整接触点的问题已经解决。谢谢。 - Mahmut K.

3
这是 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接