CompositeDrawable.java revision 3d9017263a760990ba79d5ebf3d1b6587e0bd311
1df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/* 2df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Copyright (C) 2015 The Android Open Source Project 3df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * 4df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Licensed under the Apache License, Version 2.0 (the "License"); 5df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * you may not use this file except in compliance with the License. 6df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * You may obtain a copy of the License at 7df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * 8df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * http://www.apache.org/licenses/LICENSE-2.0 9df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * 10df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Unless required by applicable law or agreed to in writing, software 11df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * distributed under the License is distributed on an "AS IS" BASIS, 12df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * See the License for the specific language governing permissions and 14df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * limitations under the License. 15df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 16df64e524a2bad079e6b0aa2d22c287f2c62aed82susnatapackage android.support.v17.leanback.graphics; 17df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 183d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.annotation.TargetApi; 19df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Canvas; 20df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.ColorFilter; 21df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.PixelFormat; 22df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Rect; 23df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.drawable.Drawable; 243d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.os.Build; 253d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.util.Property; 26df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 27df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport java.util.ArrayList; 28df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 29df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/** 303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Generic drawable class that can be composed of multiple children. Whenever the bounds changes 313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * for this class, it updates those of it's children by calling {@link ChildDrawable#updateBounds}. 32df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 343d9017263a760990ba79d5ebf3d1b6587e0bd311susnatapublic class CompositeDrawable extends Drawable implements Drawable.Callback { 353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata protected ArrayList<ChildDrawable> children = new ArrayList(); 36df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 37df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 38df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Adds the supplied region. 39df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void addChildDrawable(Drawable drawable) { 413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.add(new ChildDrawable(drawable, this)); 423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata drawable.setCallback(this); 43df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 44df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 45df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link Drawable} for the given index. 47df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Drawable getDrawable(int index) { 493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return children.get(index).mDrawable; 50df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 51df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 52df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link ChildDrawable} at the given index. 54df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public ChildDrawable getChildAt(int index) { 563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return children.get(index); 573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Removes the child corresponding to the given index. 613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void removeChild(int index) { 633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.remove(index); 64df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 65df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 66df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 67df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Removes the given region. 68df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void removeDrawable(Drawable drawable) { 703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (drawable == children.get(i).mDrawable) { 723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setCallback(null); 733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.remove(i); 743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return; 753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 77df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 78df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 79df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the total number of children. 81df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public int getChildCount() { 833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return children.size(); 84df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 85df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 86df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 87df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void draw(Canvas canvas) { 883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.draw(canvas); 90df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 91df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 92df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 93df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 94df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata protected void onBoundsChange(Rect bounds) { 95df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata super.onBoundsChange(bounds); 963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata updateBounds(bounds); 97df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 98df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 99df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 100df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void setColorFilter(ColorFilter colorFilter) { 1013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setColorFilter(colorFilter); 103df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 104df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 105df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 106df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 107df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public int getOpacity() { 108df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata return PixelFormat.UNKNOWN; 109df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 110df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 111df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 112df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void setAlpha(int alpha) { 1133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setAlpha(alpha); 1153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 1193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void invalidateDrawable(Drawable who) { 1203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata invalidateSelf(); 1213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 1243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void scheduleDrawable(Drawable who, Runnable what, long when) { 1253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata scheduleSelf(what, when); 1263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 1293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void unscheduleDrawable(Drawable who, Runnable what) { 1303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata unscheduleSelf(what); 1313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Updates the bounds based on the {@link BoundsRule}. 1353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata void updateBounds(Rect bounds) { 1373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata ChildDrawable childDrawable = children.get(i); 1393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata childDrawable.updateBounds(bounds); 1403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Wrapper class holding a drawable object and {@link BoundsRule} to update drawable bounds 1453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * when parent bound changes. 1463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 1483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final class ChildDrawable { 1493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final BoundsRule boundsRule = new BoundsRule(); 1503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final Drawable mDrawable; 1513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final Rect adjustedBounds = new Rect(); 1523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final CompositeDrawable mParent; 1533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public ChildDrawable(Drawable drawable, CompositeDrawable parent) { 1553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata this.mDrawable = drawable; 1563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata this.mParent = parent; 1573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the instance of {@link BoundsRule}. 1613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public BoundsRule getBoundsRule() { 1633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return this.boundsRule; 1643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link Drawable}. 1683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Drawable getDrawable() { 1703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return mDrawable; 1713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Updates the bounds based on the {@link BoundsRule}. 1753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata void updateBounds(Rect bounds) { 1773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata boundsRule.calculateBounds(bounds, adjustedBounds); 1783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata mDrawable.setBounds(adjustedBounds); 1793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata void recomputeBounds() { 1823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata updateBounds(mParent.getBounds()); 183df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 1843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideTop attribute. 1873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Integer> TOP_ABSOLUTE 1893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Integer>(Integer.class, "absoluteTop") { 1903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 1923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 1933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mTop == null) { 1943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop = BoundsRule.absoluteValue(value); 1953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 1963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop.setAbsoluteValue(value); 1973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 2003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 2043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mTop.getAbsoluteValue(); 2053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 2073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideBottom attribute. 2113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Integer> BOTTOM_ABSOLUTE 2133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Integer>( 2143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata Integer.class, "absoluteBottom") { 2153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 2183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mBottom == null) { 2193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom = BoundsRule.absoluteValue(value); 2203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 2213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom.setAbsoluteValue(value); 2223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 2253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 2293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mBottom.getAbsoluteValue(); 2303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 2323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideLeft attribute. 2363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Integer> LEFT_ABSOLUTE 2383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Integer>( 2393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata Integer.class, "absoluteLeft") { 2403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 2433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mLeft == null) { 2443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft = BoundsRule.absoluteValue(value); 2453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 2463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft.setAbsoluteValue(value); 2473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 2503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 2543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mLeft.getAbsoluteValue(); 2553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 2573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideRight attribute. 2603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Integer> RIGHT_ABSOLUTE 2623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Integer>( 2633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata Integer.class, "absoluteRight") { 2643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 2673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mRight == null) { 2683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight = BoundsRule.absoluteValue(value); 2693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 2703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight.setAbsoluteValue(value); 2713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 2743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 2783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mRight.getAbsoluteValue(); 2793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 2813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 2843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 2853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 2863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_TOP_ABSOLUTE} when the exact start/end position of scroll movement 2873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 2883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Float> TOP_FRACTION 2903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionTop") { 2913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 2943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mTop == null) { 2953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop = BoundsRule.inheritFromParent(value); 2963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 2973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop.setFraction(value); 2983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 3053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mTop.getFraction(); 3063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 3113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 3123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 3133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_BOTTOM_ABSOLUTE} when the exact start/end position of scroll movement 3143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 3153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Float> BOTTOM_FRACTION 3173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Float>( 3183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata Float.class, "fractionBottom") { 3193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 3223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mBottom == null) { 3233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom = BoundsRule.inheritFromParent(value); 3243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom.setFraction(value); 3263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 3333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mBottom.getFraction(); 3343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 3393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 3403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 3413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_LEFT_ABSOLUTE} when the exact start/end position of scroll movement 3423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 3433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Float> LEFT_FRACTION 3453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionLeft") { 3463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 3493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mLeft == null) { 3503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft = BoundsRule.inheritFromParent(value); 3513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft.setFraction(value); 3533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 3603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mLeft.getFraction(); 3613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3643d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3653d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 3663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 3673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 3683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_RIGHT_ABSOLUTE} when the exact start/end position of scroll movement 3693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 3703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final Property<CompositeDrawable.ChildDrawable, Float> RIGHT_FRACTION 3723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata = new Property<CompositeDrawable.ChildDrawable, Float>( 3733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata Float.class, "fractoinRight") { 3743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 3773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mRight == null) { 3783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight = BoundsRule.inheritFromParent(value); 3793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight.setFraction(value); 3813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 3883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mRight.getFraction(); 3893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 391df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 392df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata} 393