I'm porting an app written in a graphics environment that allows drawing to happen outside the bounds of the clipping rectangle. Any way to do this in Android?
I'm porting an app written in a graphics environment that allows drawing to happen outside the bounds of the clipping rectangle. Any way to do this in Android?
The answer @numan gave is almost ok, the problem is memory allocation with that approach, so we should be doing this, instead:
// 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);
That solves the problem :-)
If you want to draw text out of bounds in TextView, you should be doing this instead:
<TextView
...
android:shadowColor="#01000000"
android:shadowDx="100" // out of right bound
android:shadowDy="0"
android:shadowRadius="1"
.../>
It's not working to use clipRect() like @numan's answer because TextView clip it's own rect in 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);
Last but not least, Don't forget to set android:clipChildren="false" and android:clipToPadding="false" in your parent ViewGroup
If what you want is just draw outside the view bounds (programmatically), cut the long story short.
parentLayout.setClipChildren(false);
or via xml :
android:clipChildren="false"