19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.ColorFilter; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is only used by View for displaying its scroll bars. It should probably 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be moved in to the view package since it is used in that lower-level layer. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For now, we'll hide it so it can be cleaned up later. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ScrollBarDrawable extends Drawable { 3203748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette private static final int[] STATE_ENABLED = new int[] { android.R.attr.state_enabled }; 3303748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mVerticalTrack; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mHorizontalTrack; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mVerticalThumb; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mHorizontalThumb; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRange; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mOffset; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mExtent; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mVertical; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mChanged; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRangeChanged; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mTempBounds = new Rect(); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAlwaysDrawHorizontalTrack; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAlwaysDrawVerticalTrack; 47f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette private boolean mMutated; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ScrollBarDrawable() { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicate whether the horizontal scrollbar track should always be drawn regardless of the 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extent. Defaults to false. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alwaysDrawTrack Set to true if the track should always be drawn 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlwaysDrawHorizontalTrack(boolean alwaysDrawTrack) { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlwaysDrawHorizontalTrack = alwaysDrawTrack; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicate whether the vertical scrollbar track should always be drawn regardless of the 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extent. Defaults to false. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alwaysDrawTrack Set to true if the track should always be drawn 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlwaysDrawVerticalTrack(boolean alwaysDrawTrack) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlwaysDrawVerticalTrack = alwaysDrawTrack; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the vertical scrollbar track should always be drawn regardless of the 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extent. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getAlwaysDrawVerticalTrack() { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAlwaysDrawVerticalTrack; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the horizontal scrollbar track should always be drawn regardless of the 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extent. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getAlwaysDrawHorizontalTrack() { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAlwaysDrawHorizontalTrack; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setParameters(int range, int offset, int extent, boolean vertical) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVertical != vertical) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChanged = true; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRange != range || mOffset != offset || mExtent != extent) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRangeChanged = true; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRange = range; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOffset = offset; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtent = extent; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVertical = vertical; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean vertical = mVertical; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int extent = mExtent; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int range = mRange; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean drawTrack = true; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean drawThumb = true; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (extent <= 0 || range <= extent) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawTrack = vertical ? mAlwaysDrawVerticalTrack : mAlwaysDrawHorizontalTrack; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawThumb = false; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r = getBounds(); 1178fb954263dd2f918ad339045cc6d82e346515599Romain Guy if (canvas.quickReject(r.left, r.top, r.right, r.bottom, Canvas.EdgeType.AA)) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawTrack) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawTrack(canvas, r, vertical); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawThumb) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = vertical ? r.height() : r.width(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int thickness = vertical ? r.width() : r.height(); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = Math.round((float) size * extent / range); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset = Math.round((float) (size - length) * mOffset / (range - extent)); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // avoid the tiny thumb 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minLength = thickness * 2; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length < minLength) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project length = minLength; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // avoid the too-big thumb 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offset + length > size) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset = size - length; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawThumb(canvas, r, offset, length, vertical); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onBoundsChange(bounds); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChanged = true; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawTrack(Canvas canvas, Rect bounds, boolean vertical) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable track; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vertical) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track = mVerticalTrack; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track = mHorizontalTrack; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (track != null) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChanged) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track.setBounds(bounds); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project track.draw(canvas); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawThumb(Canvas canvas, Rect bounds, int offset, int length, boolean vertical) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect thumbRect = mTempBounds; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean changed = mRangeChanged || mChanged; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (changed) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vertical) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thumbRect.set(bounds.left, bounds.top + offset, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.right, bounds.top + offset + length); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thumbRect.set(bounds.left + offset, bounds.top, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.left + offset + length, bounds.bottom); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vertical) { 1796c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mVerticalThumb != null) { 1806c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase final Drawable thumb = mVerticalThumb; 1816c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (changed) thumb.setBounds(thumbRect); 1826c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase thumb.draw(canvas); 1836c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1856c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mHorizontalThumb != null) { 1866c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase final Drawable thumb = mHorizontalThumb; 1876c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (changed) thumb.setBounds(thumbRect); 1886c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase thumb.draw(canvas); 1896c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVerticalThumbDrawable(Drawable thumb) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thumb != null) { 195f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mMutated) { 196f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette thumb.mutate(); 197f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 19803748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette thumb.setState(STATE_ENABLED); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalThumb = thumb; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVerticalTrackDrawable(Drawable track) { 20403748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette if (track != null) { 205f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mMutated) { 206f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette track.mutate(); 207f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 20803748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette track.setState(STATE_ENABLED); 20903748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalTrack = track; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setHorizontalThumbDrawable(Drawable thumb) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (thumb != null) { 215f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mMutated) { 216f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette thumb.mutate(); 217f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 21803748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette thumb.setState(STATE_ENABLED); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHorizontalThumb = thumb; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setHorizontalTrackDrawable(Drawable track) { 22403748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette if (track != null) { 225f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mMutated) { 226f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette track.mutate(); 227f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 22803748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette track.setState(STATE_ENABLED); 22903748a5707fe3d1f071226ea3caf571abdc0d25dAlan Viverette } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHorizontalTrack = track; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSize(boolean vertical) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vertical) { 2356c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase return mVerticalTrack != null ? mVerticalTrack.getIntrinsicWidth() : 2366c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mVerticalThumb != null ? mVerticalThumb.getIntrinsicWidth() : 0; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2386c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase return mHorizontalTrack != null ? mHorizontalTrack.getIntrinsicHeight() : 2396c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mHorizontalThumb != null ? mHorizontalThumb.getIntrinsicHeight() : 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 244f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette public ScrollBarDrawable mutate() { 245f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (!mMutated && super.mutate() == this) { 246f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mVerticalTrack != null) { 247f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette mVerticalTrack.mutate(); 248f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 249f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mVerticalThumb != null) { 250f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette mVerticalThumb.mutate(); 251f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 252f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mHorizontalTrack != null) { 253f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette mHorizontalTrack.mutate(); 254f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 255f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette if (mHorizontalThumb != null) { 256f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette mHorizontalThumb.mutate(); 257f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 258f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette mMutated = true; 259f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 260f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette return this; 261f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette } 262f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette 263f8512ce08174426dfbba96e8108e5a64332f1e71Alan Viverette @Override 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(int alpha) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVerticalTrack != null) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalTrack.setAlpha(alpha); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2686c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mVerticalThumb != null) { 2696c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mVerticalThumb.setAlpha(alpha); 2706c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHorizontalTrack != null) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHorizontalTrack.setAlpha(alpha); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2746c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mHorizontalThumb != null) { 2756c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mHorizontalThumb.setAlpha(alpha); 2766c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 280b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 281b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase // All elements should have same alpha, just return one of them 282b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return mVerticalThumb.getAlpha(); 283b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 284b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 285b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase @Override 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setColorFilter(ColorFilter cf) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVerticalTrack != null) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalTrack.setColorFilter(cf); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2906c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mVerticalThumb != null) { 2916c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mVerticalThumb.setColorFilter(cf); 2926c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHorizontalTrack != null) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHorizontalTrack.setColorFilter(cf); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2966c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase if (mHorizontalThumb != null) { 2976c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase mHorizontalThumb.setColorFilter(cf); 2986c8fef7fb866d244486a962dd82f4a6f26505f16Chet Haase } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSLUCENT; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ScrollBarDrawable: range=" + mRange + " offset=" + mOffset + 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " extent=" + mExtent + (mVertical ? " V" : " H"); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 314