OSDN Git Service

Mutate scroll bar drawables
authorAlan Viverette <alanv@google.com>
Thu, 5 Feb 2015 23:58:56 +0000 (15:58 -0800)
committerAlan Viverette <alanv@google.com>
Thu, 5 Feb 2015 23:58:56 +0000 (15:58 -0800)
Bug: 19285726
Change-Id: I4bb596433c1fa1cc4e2fa53d0cdae992f9add858

core/java/android/view/View.java
core/java/android/widget/ScrollBarDrawable.java

index 6928b2c..e4a8978 100644 (file)
@@ -12872,7 +12872,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                         Interpolator.Result.FREEZE_END) {
                     cache.state = ScrollabilityCache.OFF;
                 } else {
-                    cache.scrollBar.setAlpha(Math.round(values[0]));
+                    cache.scrollBar.mutate().setAlpha(Math.round(values[0]));
                 }
 
                 // This will make the scroll bars inval themselves after
@@ -12882,7 +12882,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
             } else {
                 // We're just on -- but we may have been fading before so
                 // reset alpha
-                cache.scrollBar.setAlpha(255);
+                cache.scrollBar.mutate().setAlpha(255);
             }
 
 
index 10e9ff4..8eff1aa 100644 (file)
@@ -44,6 +44,7 @@ public class ScrollBarDrawable extends Drawable {
     private final Rect mTempBounds = new Rect();
     private boolean mAlwaysDrawHorizontalTrack;
     private boolean mAlwaysDrawVerticalTrack;
+    private boolean mMutated;
 
     public ScrollBarDrawable() {
     }
@@ -191,6 +192,9 @@ public class ScrollBarDrawable extends Drawable {
 
     public void setVerticalThumbDrawable(Drawable thumb) {
         if (thumb != null) {
+            if (mMutated) {
+                thumb.mutate();
+            }
             thumb.setState(STATE_ENABLED);
             mVerticalThumb = thumb;
         }
@@ -198,6 +202,9 @@ public class ScrollBarDrawable extends Drawable {
 
     public void setVerticalTrackDrawable(Drawable track) {
         if (track != null) {
+            if (mMutated) {
+                track.mutate();
+            }
             track.setState(STATE_ENABLED);
         }
         mVerticalTrack = track;
@@ -205,6 +212,9 @@ public class ScrollBarDrawable extends Drawable {
 
     public void setHorizontalThumbDrawable(Drawable thumb) {
         if (thumb != null) {
+            if (mMutated) {
+                thumb.mutate();
+            }
             thumb.setState(STATE_ENABLED);
             mHorizontalThumb = thumb;
         }
@@ -212,6 +222,9 @@ public class ScrollBarDrawable extends Drawable {
 
     public void setHorizontalTrackDrawable(Drawable track) {
         if (track != null) {
+            if (mMutated) {
+                track.mutate();
+            }
             track.setState(STATE_ENABLED);
         }
         mHorizontalTrack = track;
@@ -228,6 +241,26 @@ public class ScrollBarDrawable extends Drawable {
     }
 
     @Override
+    public ScrollBarDrawable mutate() {
+        if (!mMutated && super.mutate() == this) {
+            if (mVerticalTrack != null) {
+                mVerticalTrack.mutate();
+            }
+            if (mVerticalThumb != null) {
+                mVerticalThumb.mutate();
+            }
+            if (mHorizontalTrack != null) {
+                mHorizontalTrack.mutate();
+            }
+            if (mHorizontalThumb != null) {
+                mHorizontalThumb.mutate();
+            }
+            mMutated = true;
+        }
+        return this;
+    }
+
+    @Override
     public void setAlpha(int alpha) {
         if (mVerticalTrack != null) {
             mVerticalTrack.setAlpha(alpha);