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)
在这里,由于我触摸的位置,蓝色矩形与下方的视图稍微不对齐 - 我希望它完全覆盖视图,无论用户触摸的位置如何.
这是我最终使用@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)