我正在移植一个在图形环境中编写的应用程序,该应用程序允许绘图发生在剪切矩形的边界之外。有什么方法可以在Android中执行此操作吗?
答案 0 :(得分:44)
要在边界外绘图,您需要展开画布的clipRect。
查看Canvas类上的重载clipRect方法。
注意 - 您需要指定Region操作,因为默认操作是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
答案 1 :(得分:29)
尝试设置
android:clipChildren="false"
到父视图
答案 2 :(得分:9)
您可以在您喜欢的地方绘制,但不会在剪裁矩形之外保存任何内容。
答案 3 :(得分:2)
@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);
解决了这个问题: - )
答案 4 :(得分:2)
如果你想在TextView中绘制超出范围的文本,你应该这样做:
<TextView
...
android:shadowColor="#01000000"
android:shadowDx="100" // out of right bound
android:shadowDy="0"
android:shadowRadius="1"
.../>
像@numan的回答一样使用clipRect()是不行的,因为TextView在onDraw()中剪辑它自己的rect:
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"