Can I draw outside the bounds of an Android Canvas

前端 未结 5 1136
我在风中等你
我在风中等你 2020-11-29 06:27

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?

相关标签:
5条回答
  • 2020-11-29 06:53

    You can draw where you like, but nothing will be saved outside the clipping rectangle.

    0 讨论(0)
  • 2020-11-29 07:02

    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

    0 讨论(0)
  • 2020-11-29 07:05

    try to set

    android:clipChildren="false" 
    

    to the parent view

    0 讨论(0)
  • 2020-11-29 07:05

    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 :-)

    0 讨论(0)
  • 2020-11-29 07:15

    To draw outside the bounds, you need to expand the clipRect of the canvas.

    Check out the overloaded clipRect methods on the Canvas class.

    Note - You will need to specify the Region operation because the default operation is INTERSECT. So something like this:

    Rect newRect = canvas.getClipBounds();
    newRect.inset(-5, -5)  //make the rect larger
    
    canvas.clipRect (newRect, Region.Op.REPLACE);
    //happily draw outside the bound now
    
    0 讨论(0)
提交回复
热议问题