我能否在Android画布的边界之外绘图?

39

我正在移植一个在图形环境下编写的应用程序,该环境允许绘图发生在剪辑矩形框之外。有没有在Android中实现这个功能的方法?

6个回答

54

尝试设置

android:clipChildren="false" 

到父视图


3
我不知道问题是什么,但我想感谢你解决了我所面临的问题。谢谢你。这就是我一直在寻找的东西。 - shadyinside
请查看https://dev59.com/i4_ea4cB1Zd3GeqPNmXu。 - Morteza Rastgoo
@MortezaRastgoo 这个链接的问题(和答案)根本不能直接应用到这个问题。 - Martin Marconcini

48

要在画布的边界外绘制,您需要扩展画布的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

2
完全没有效果。我只是用(-2000,-2000)的参数调整了画布的大小,然后对其进行平移,但我绘制的图像仍然被裁剪。 - tomrozb
但是如果你在每个onDraw(Canvas canvas)中都这样做,那么你不是让计算机多做了很多额外的工作吗? - Someone Somewhere
第一次调用Invalidate时可以正常工作,但后续的调用将不起作用。 - jjxtra
1
@MortezaRastgoo 这个链接的问题(和答案)根本不能直接应用到这个问题上。 - Martin Marconcini
6
Region.Op.REPLACE在API >= 26已经被弃用。你有其他解决方案吗?我已经查遍了所有的SOF,但还没有找到答案。 - Arthur Melo
显示剩余3条评论

10

你可以在喜欢的位置绘制,但是超出剪切矩形的部分将不会被保存。


1
那么如何保存呢?我卡住了。 - user9339131

5
答案@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 - Anton Malmygin
2
好的,我想这里的重点是在每个对象初始化时分配newRect,而不是在每次调用onDraw时分配它。 - Anton Malmygin
2
Region.Op.REPLACE已经被弃用,它不再起作用了! - Mohit Atray

3
如果你想在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"

【已解决】行了!((ViewGroup) parent).setClipChildren(true); ((ViewGroup) parent).setClipToPadding(true); 当我需要在同一层次上绘制其他视图时,使用此方法解决了我的问题,谢谢! - Arthur Melo

2
如果你只是想在视图范围之外绘制(以编程方式),那么简而言之。
parentLayout.setClipChildren(false);

或者通过xml

 android:clipChildren="false"

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接