Xamarin Android:如何实现带旋转效果的拖动阴影(DragShadow)?
实现带旋转效果的DragShadow
我之前也踩过这个坑!默认的DragShadowBuilder压根不会继承原视图的旋转属性,只会原样绘制视图的缓存内容,所以得自定义一个DragShadowBuilder来手动处理旋转逻辑。下面是具体的实现步骤和代码示例:
核心思路
默认的onDrawShadow方法只是直接绘制视图的快照,没有应用任何变换。我们需要重写这个方法,在绘制前给画布应用和原TextView相同的旋转角度,并且要保证旋转中心和原视图一致,避免阴影出现偏移。
自定义RotatedDragShadowBuilder
Java版本
public class RotatedDragShadowBuilder extends View.DragShadowBuilder { private final View mTargetView; private final float mViewRotation; public RotatedDragShadowBuilder(View targetView) { super(targetView); mTargetView = targetView; // 保存原视图的旋转角度 mViewRotation = targetView.getRotation(); } @Override public void onDrawShadow(Canvas canvas) { // 先保存画布当前状态,避免影响后续绘制操作 canvas.save(); // 计算阴影的中心点,以这个点为旋转中心(和原视图的旋转中心一致) float shadowCenterX = mTargetView.getWidth() / 2f; float shadowCenterY = mTargetView.getHeight() / 2f; // 给画布应用旋转角度 canvas.rotate(mViewRotation, shadowCenterX, shadowCenterY); // 调用父类方法绘制原视图的内容 super.onDrawShadow(canvas); // 恢复画布之前的状态 canvas.restore(); } }
Kotlin版本
class RotatedDragShadowBuilder(targetView: View) : View.DragShadowBuilder(targetView) { private val viewRotation = targetView.rotation override fun onDrawShadow(canvas: Canvas) { canvas.save() val shadowCenterX = view.width / 2f val shadowCenterY = view.height / 2f canvas.rotate(viewRotation, shadowCenterX, shadowCenterY) super.onDrawShadow(canvas) canvas.restore() } }
调用自定义ShadowBuilder
在启动拖放操作时,使用我们自定义的RotatedDragShadowBuilder替代默认的即可:
Java调用示例
// 假设你的旋转TextView实例是rotatedTextView rotatedTextView.setOnLongClickListener(v -> { // 创建空的ClipData(如果不需要传递数据的话) ClipData clipData = ClipData.newPlainText("", ""); DragShadowBuilder shadowBuilder = new RotatedDragShadowBuilder(v); // 启动拖放操作 v.startDragAndDrop(clipData, shadowBuilder, v, 0); return true; });
Kotlin调用示例
rotatedTextView.setOnLongClickListener { v -> val clipData = ClipData.newPlainText("", "") val shadowBuilder = RotatedDragShadowBuilder(v) v.startDragAndDrop(clipData, shadowBuilder, v, 0) true }
常见问题排查
如果之前的Java方案没生效,大概率是这几个原因:
- 没有保存/恢复画布状态:导致旋转操作影响了其他绘制逻辑
- 旋转中心设置错误:没有以阴影的中心点为旋转轴,导致阴影偏移或旋转角度不对
- 没有正确获取原视图的旋转角度:比如在视图旋转前就初始化了ShadowBuilder,导致角度值错误
内容的提问来源于stack exchange,提问作者A. Schmidt
相关产品推荐
相关产品推荐

