【问题标题】:android dragshadowbuilder shadow sizeandroid dragshadowbuilder 阴影大小
【发布时间】:2014-10-02 14:29:18
【问题描述】:

我尝试在拖动开始时增加图像的阴影
我创建了自定义 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);

}}

是什么原因?

【问题讨论】:

    标签: android drag-and-drop


    【解决方案1】:

    嗯,这在文档中不是很清楚。我正在使用给定的构建器来减小尺寸,您只需要根据您的情况通过乘法来更改除法;

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

    【讨论】:

    • 我的改变大小和调整接触点的问题已经解决了。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 2014-03-10
      • 2013-04-16
      • 2011-07-11
      相关资源
      最近更新 更多