OSDN Git Service

Fixes for setClipBounds()
authorChet Haase <chet@google.com>
Wed, 17 Apr 2013 00:21:41 +0000 (17:21 -0700)
committerChet Haase <chet@google.com>
Wed, 17 Apr 2013 00:57:11 +0000 (17:57 -0700)
The invalidate region when the clip bounds are set needs to encompass both
the old clip bounds and the new bounds, to make sure that the right area
of the view gets erased as well as drawn.

Also, we need to keep our own internal copy of the bounds, not just use the
instance passed into the setter.

Issue #8634060 setClipBounds() problems

Change-Id: I123c49cff16e3debe8866974a5612a4efd010de4

core/java/android/view/View.java

index 4fb2431..be26d20 100644 (file)
@@ -13380,18 +13380,32 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
 
     /**
      * Sets a rectangular area on this view to which the view will be clipped
-     * it is drawn. Setting the value to null will remove the clip bounds
+     * when it is drawn. Setting the value to null will remove the clip bounds
      * and the view will draw normally, using its full bounds.
      *
      * @param clipBounds The rectangular area, in the local coordinates of
      * this view, to which future drawing operations will be clipped.
      */
     public void setClipBounds(Rect clipBounds) {
-        mClipBounds = clipBounds;
         if (clipBounds != null) {
-            invalidate(clipBounds);
+            if (clipBounds.equals(mClipBounds)) {
+                return;
+            }
+            if (mClipBounds == null) {
+                invalidate();
+                mClipBounds = new Rect(clipBounds);
+            } else {
+                invalidate(Math.min(mClipBounds.left, clipBounds.left),
+                        Math.min(mClipBounds.top, clipBounds.top),
+                        Math.max(mClipBounds.right, clipBounds.right),
+                        Math.max(mClipBounds.bottom, clipBounds.bottom));
+                mClipBounds.set(clipBounds);
+            }
         } else {
-            invalidate();
+            if (mClipBounds != null) {
+                invalidate();
+                mClipBounds = null;
+            }
         }
     }