【发布时间】:2011-05-01 00:09:45
【问题描述】:
我正在移植一个在图形环境中编写的应用程序,该应用程序允许在剪切矩形的边界之外进行绘图。有什么方法可以在 Android 中做到这一点?
【问题讨论】:
标签: android drawing image-clipping
我正在移植一个在图形环境中编写的应用程序,该应用程序允许在剪切矩形的边界之外进行绘图。有什么方法可以在 Android 中做到这一点?
【问题讨论】:
标签: android drawing image-clipping
尝试设置
android:clipChildren="false"
到父视图
【讨论】:
要在边界之外绘制,你需要扩展画布的clipRect。
查看 Canvas 类中重载的 clipRect 方法。
注意 - 您需要指定区域操作,因为默认操作是 INTERSECT。所以是这样的:
Rect newRect = canvas.getClipBounds();
newRect.inset(-5, -5) //make the rect larger
canvas.clipRect (newRect, Region.Op.REPLACE);
//happily draw outside the bound now
【讨论】:
onDraw(Canvas canvas) 上都这样做,那么你不是让计算机做很多额外的工作吗?
您可以在您喜欢的地方绘制,但在剪切矩形之外不会保存任何内容。
【讨论】:
@numan 给出的答案几乎没问题,问题是这种方法的内存分配,所以我们应该这样做:
// in constructor/elsewhere
Rect newRect = new Rect();
// in onDraw
canvas.getClipBounds(newRect);
newRect.inset(0, -20); //make the rect larger
canvas.clipRect(newRect, Region.Op.REPLACE);
这解决了问题:-)
【讨论】:
newRect?
Region.Op.REPLACE 已弃用。它不再起作用了!
如果你想在 TextView 中越界绘制文本,你应该这样做:
<TextView
...
android:shadowColor="#01000000"
android:shadowDx="100" // out of right bound
android:shadowDy="0"
android:shadowRadius="1"
.../>
像@numan 的回答那样使用clipRect() 不起作用,因为TextView 剪辑它是onDraw() 中的自己的矩形:
if (mShadowRadius != 0) {
clipLeft += Math.min(0, mShadowDx - mShadowRadius);
clipRight += Math.max(0, mShadowDx + mShadowRadius);
clipTop += Math.min(0, mShadowDy - mShadowRadius);
clipBottom += Math.max(0, mShadowDy + mShadowRadius);
}
canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom);
最后但同样重要的是,不要忘记在您的父 ViewGroup 中设置 android:clipChildren="false" 和 android:clipToPadding="false"
【讨论】: