我可以在Android Canvas的范围之外绘制

时间:2010-10-26 21:42:02

标签: android drawing image-clipping

我正在移植一个在图形环境中编写的应用程序,该应用程序允许绘图发生在剪切矩形的边界之外。有什么方法可以在Android中执行此操作吗?

5 个答案:

答案 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"