如何在View.DragShadowBuilder.onProvideShadowMetrics中定位画布

Kar*_*rde 5 android canvas shadow drag

我有一个要求,即可拖动的视图需要将阴影最初直接放置在视图的顶部 - 也就是说,它覆盖整个视图而不是与触摸点相关.

我一直在尝试各种各样的方法来使用我的子类,View.DragShadowBuilder但没有运气.我希望使用drawRect允许我指定矩形点,以便它将绘制在与我的视图相同的矩形中,但这会导致不绘制画布.

但是,仅使用canvas.drawColor(Color.CYAN)绘制矩形,但相对于触摸点.

这是我的尝试使用drawRect:

    private class VideoDragShadowBuilder extends View.DragShadowBuilder {

    public VideoDragShadowBuilder(View v) {
        super(v);
    }

    @Override
    public void onProvideShadowMetrics (Point size, Point touch) {
        int width, height;

        width = getView().getWidth();
        height = getView().getHeight();

        size.set(width, height);
        touch.set(width / 2, height / 2);
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        //canvas.drawColor(Color.CYAN);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setAlpha(45);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.CYAN);

        canvas.drawRect(getView().getLeft(), getView().getTop(), getView().getRight(), getView().getBottom(), paint);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,由于我触摸的位置,蓝色矩形与下方的视图稍微不对齐 - 我希望它完全覆盖视图,无论用户触摸的位置如何.

在此输入图像描述

Kar*_*rde 3

这是我最终使用@pskink 的建议得到的解决方案。我根本不必使用drawRect,关键是设置我以前没有的触摸点,因为我没有使用onTouchEvent。为可能遇到同样问题的任何人添加此内容。

private Point lastTouch;

public DraggableFrameLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    dragListener = new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            View.DragShadowBuilder videoShadow = new DragShadowBuilder(v);
            v.startDrag(draggableData, videoShadow, null, 0);
            return true;
        }
    };
}

@Override
public boolean onTouchEvent (MotionEvent ev)    {
    lastTouch = new Point((int) ev.getX(), (int) ev.getY()) ;
    return super.onTouchEvent(ev);
}

private class DragShadowBuilder extends View.DragShadowBuilder {

    public VideoDragShadowBuilder(View v) {
        super(v);
    }

    @Override
    public void onProvideShadowMetrics (Point size, Point touch) {
        super.onProvideShadowMetrics(size, touch);

        // The touch point must be set in order for the canvas to properly fit the view
        if (lastTouch != null) {
            touch.set(lastTouch.x, lastTouch.y);
        }
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        super.onDrawShadow(canvas);
        canvas.drawColor(Color.CYAN);
    }
}   
Run Code Online (Sandbox Code Playgroud)