CompositeDrawable.java revision 450fe7ab2d8a911ecdc335d55c60dfbae70f2407
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; 1900f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.content.res.Resources; 20df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Canvas; 21df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.ColorFilter; 22df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.PixelFormat; 23df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.Rect; 24df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport android.graphics.drawable.Drawable; 253d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.os.Build; 2600f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.support.annotation.NonNull; 2700f780c9e3cca0b2e364c61e936147e09877c43fDake Guimport android.support.v4.graphics.drawable.DrawableCompat; 283d9017263a760990ba79d5ebf3d1b6587e0bd311susnataimport android.util.Property; 29df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 30df64e524a2bad079e6b0aa2d22c287f2c62aed82susnataimport java.util.ArrayList; 31df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 32df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata/** 333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Generic drawable class that can be composed of multiple children. Whenever the bounds changes 3415c3f439b0dad70925e5fec0508a17976b881dabsusnata * for this class, it updates those of it's children. 35df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 373d9017263a760990ba79d5ebf3d1b6587e0bd311susnatapublic class CompositeDrawable extends Drawable implements Drawable.Callback { 3800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 3900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu static class CompositeState extends Drawable.ConstantState { 4000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 4100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> mChildren; 4200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 4300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu CompositeState() { 4400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mChildren = new ArrayList<ChildDrawable>(); 4500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 4600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 4700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu CompositeState(CompositeState other, CompositeDrawable parent, Resources res) { 4800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final int n = other.mChildren.size(); 4900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mChildren = new ArrayList<ChildDrawable>(n); 5000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu for (int k = 0; k < n; k++) { 5100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mChildren.add(new ChildDrawable(other.mChildren.get(k), parent, res)); 5200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 5300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 5400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 5500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu @NonNull 5600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu @Override 5700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public Drawable newDrawable() { 5800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return new CompositeDrawable(this); 5900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 6000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 6100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu @Override 6200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public int getChangingConfigurations() { 6300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return 0; 6400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 6500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 6600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 6700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 6800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu CompositeState mState; 6900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu boolean mMutated = false; 7000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 7100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public CompositeDrawable() { 7200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mState = new CompositeState(); 7300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 7400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 7500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu CompositeDrawable(CompositeState state) { 7600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mState = state; 7700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 7800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 7900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu @Override 8000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public ConstantState getConstantState() { 8100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return mState; 8200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 8300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 8400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu @Override 8500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public Drawable mutate() { 8600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (!mMutated && super.mutate() == this) { 8700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mState = new CompositeState(mState, this, null); 8800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 8900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu for (int i = 0, n = children.size(); i < n; i++) { 9000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable dr = children.get(i).mDrawable; 9100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (dr != null) { 9200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu dr.mutate(); 9300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 9400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 9500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mMutated = true; 9600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 9700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return this; 9800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 99df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 100df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 101df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Adds the supplied region. 102df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 1033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void addChildDrawable(Drawable drawable) { 10400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mState.mChildren.add(new ChildDrawable(drawable, this)); 105df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 106df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 107df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 1083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link Drawable} for the given index. 109df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 1103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Drawable getDrawable(int index) { 11100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return mState.mChildren.get(index).mDrawable; 112df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 113df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 114df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 1153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link ChildDrawable} at the given index. 116df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 1173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public ChildDrawable getChildAt(int index) { 11800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return mState.mChildren.get(index); 1193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 1213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 1223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Removes the child corresponding to the given index. 1233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 1243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void removeChild(int index) { 12500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mState.mChildren.remove(index); 126df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 127df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 128df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 129df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata * Removes the given region. 130df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 1313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void removeDrawable(Drawable drawable) { 13200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 1333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (drawable == children.get(i).mDrawable) { 1353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setCallback(null); 1363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.remove(i); 1373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return; 1383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 140df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 141df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 142df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata /** 1433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the total number of children. 144df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata */ 1453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public int getChildCount() { 14600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return mState.mChildren.size(); 147df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 148df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 149df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 150df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void draw(Canvas canvas) { 15100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 1523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.draw(canvas); 154df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 155df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 156df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 157df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 158df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata protected void onBoundsChange(Rect bounds) { 159df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata super.onBoundsChange(bounds); 1603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata updateBounds(bounds); 161df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 162df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 163df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 164df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void setColorFilter(ColorFilter colorFilter) { 16500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 1663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setColorFilter(colorFilter); 168df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 169df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 170df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 171df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 172df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public int getOpacity() { 173df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata return PixelFormat.UNKNOWN; 174df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 175df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata 176df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata @Override 177df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata public void setAlpha(int alpha) { 17800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 1793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 1803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata children.get(i).mDrawable.setAlpha(alpha); 1813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 1833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 18400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu /** 18500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu * @return Alpha value between 0(inclusive) and 255(inclusive) 18600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu */ 18700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu public int getAlpha() { 18800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable dr = getFirstNonNullDrawable(); 18900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (dr != null) { 19000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return DrawableCompat.getAlpha(dr); 19100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } else { 19200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return 0xFF; 19300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 19400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 19500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 19600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable getFirstNonNullDrawable() { 19700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 19800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu for (int i = 0, n = children.size(); i < n; i++) { 19900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable dr = children.get(i).mDrawable; 20000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (dr != null) { 20100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return dr; 20200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 20300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 20400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu return null; 20500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 20600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 2073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void invalidateDrawable(Drawable who) { 2093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata invalidateSelf(); 2103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void scheduleDrawable(Drawable who, Runnable what, long when) { 2143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata scheduleSelf(what, when); 2153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 2183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void unscheduleDrawable(Drawable who, Runnable what) { 2193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata unscheduleSelf(what); 2203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Updates the bounds based on the {@link BoundsRule}. 2243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata void updateBounds(Rect bounds) { 22600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ArrayList<ChildDrawable> children = mState.mChildren; 2273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata for (int i = 0; i < children.size(); i++) { 2283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata ChildDrawable childDrawable = children.get(i); 2293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata childDrawable.updateBounds(bounds); 2303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Wrapper class holding a drawable object and {@link BoundsRule} to update drawable bounds 2353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * when parent bound changes. 2363d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 2383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public static final class ChildDrawable { 239450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata private final BoundsRule mBoundsRule; 2403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final Drawable mDrawable; 2413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata private final Rect adjustedBounds = new Rect(); 242738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu final CompositeDrawable mParent; 2433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public ChildDrawable(Drawable drawable, CompositeDrawable parent) { 2453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata this.mDrawable = drawable; 2463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata this.mParent = parent; 247450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata this.mBoundsRule = new BoundsRule(); 24800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu drawable.setCallback(parent); 24900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 25000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu 25100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu ChildDrawable(ChildDrawable orig, CompositeDrawable parent, Resources res) { 25200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable dr = orig.mDrawable; 25300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final Drawable clone; 25400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (dr != null) { 25500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu final ConstantState cs = dr.getConstantState(); 25600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu if (res != null) { 25700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone = cs.newDrawable(res); 25800f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } else { 25900f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone = cs.newDrawable(); 26000f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 26100f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone.setCallback(parent); 26200f780c9e3cca0b2e364c61e936147e09877c43fDake Gu DrawableCompat.setLayoutDirection(clone, DrawableCompat.getLayoutDirection(dr)); 26300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone.setBounds(dr.getBounds()); 26400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone.setLevel(dr.getLevel()); 26500f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } else { 26600f780c9e3cca0b2e364c61e936147e09877c43fDake Gu clone = null; 26700f780c9e3cca0b2e364c61e936147e09877c43fDake Gu } 268450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata if (orig.mBoundsRule != null) { 269450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata this.mBoundsRule = new BoundsRule(orig.mBoundsRule); 270450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata } else { 271450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata this.mBoundsRule = new BoundsRule(); 272450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata } 27300f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mDrawable = clone; 27400f780c9e3cca0b2e364c61e936147e09877c43fDake Gu mParent = parent; 2753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the instance of {@link BoundsRule}. 2793d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public BoundsRule getBoundsRule() { 281450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata return this.mBoundsRule; 2823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Returns the {@link Drawable}. 2863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Drawable getDrawable() { 2883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return mDrawable; 2893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 2913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 2923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Updates the bounds based on the {@link BoundsRule}. 2933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 2943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata void updateBounds(Rect bounds) { 295450fe7ab2d8a911ecdc335d55c60dfbae70f2407susnata mBoundsRule.calculateBounds(bounds, adjustedBounds); 2963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata mDrawable.setBounds(adjustedBounds); 2973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 2983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 299e464e5647326c000d2bd48e7d4369a279894f360susnata /** 300e464e5647326c000d2bd48e7d4369a279894f360susnata * After changing the {@link BoundsRule}, user should call this function 301e464e5647326c000d2bd48e7d4369a279894f360susnata * for the drawable to recalculate its bounds. 302e464e5647326c000d2bd48e7d4369a279894f360susnata */ 303e464e5647326c000d2bd48e7d4369a279894f360susnata public void recomputeBounds() { 3043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata updateBounds(mParent.getBounds()); 305df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 3063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3073d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideTop attribute. 3093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3103103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Integer> TOP_ABSOLUTE = 3113103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Integer>( 3123103f63e99d47573823957f7aa34308555873221Aurimas Liutikas Integer.class, "absoluteTop") { 3133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 3153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mTop == null) { 3163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop = BoundsRule.absoluteValue(value); 3173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop.setAbsoluteValue(value); 3193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 326738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mTop == null) { 327738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return obj.mParent.getBounds().top; 328738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 3293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mTop.getAbsoluteValue(); 3303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3343d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideBottom attribute. 3353d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3363103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Integer> BOTTOM_ABSOLUTE = 3373103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Integer>( 3383103f63e99d47573823957f7aa34308555873221Aurimas Liutikas Integer.class, "absoluteBottom") { 3393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 3413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mBottom == null) { 3423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom = BoundsRule.absoluteValue(value); 3433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom.setAbsoluteValue(value); 3453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3483d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3493d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3503d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 352738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mBottom == null) { 353738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return obj.mParent.getBounds().bottom; 354738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 3553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mBottom.getAbsoluteValue(); 3563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideLeft attribute. 3623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3633103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Integer> LEFT_ABSOLUTE = 3643103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Integer>( 3653103f63e99d47573823957f7aa34308555873221Aurimas Liutikas Integer.class, "absoluteLeft") { 3663d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 3683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mLeft == null) { 3693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft = BoundsRule.absoluteValue(value); 3703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft.setAbsoluteValue(value); 3723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 3753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3783d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 379738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mLeft == null) { 380738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return obj.mParent.getBounds().left; 381738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 3823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mLeft.getAbsoluteValue(); 3833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 3853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 3863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 3873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overrideRight attribute. 3883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 3893103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Integer> RIGHT_ABSOLUTE = 3903103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Integer>( 3913103f63e99d47573823957f7aa34308555873221Aurimas Liutikas Integer.class, "absoluteRight") { 3923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 3933d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Integer value) { 3943d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mRight == null) { 3953d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight = BoundsRule.absoluteValue(value); 3963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 3973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight.setAbsoluteValue(value); 3983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 3993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 4013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Integer get(CompositeDrawable.ChildDrawable obj) { 405738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mRight == null) { 406738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return obj.mParent.getBounds().right; 407738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 4083d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mRight.getAbsoluteValue(); 4093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 4113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 4133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 4143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 4153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 4163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_TOP_ABSOLUTE} when the exact start/end position of scroll movement 4173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 4183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 4193103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Float> TOP_FRACTION = 4203103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionTop") { 4213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4223d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 4233d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mTop == null) { 4243d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop = BoundsRule.inheritFromParent(value); 4253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 4263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mTop.setFraction(value); 4273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4283d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4293d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 4303d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4313d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4323d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4333d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 434738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mTop == null) { 435738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return 0f; 436738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 4373d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mTop.getFraction(); 4383d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4393d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 4403d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4413d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 4423d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 4433d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 4443d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 4453d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_BOTTOM_ABSOLUTE} when the exact start/end position of scroll movement 4463d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 4473d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 4483103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Float> BOTTOM_FRACTION = 4493103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Float>( 4503103f63e99d47573823957f7aa34308555873221Aurimas Liutikas Float.class, "fractionBottom") { 4513d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4523d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 4533d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mBottom == null) { 4543d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom = BoundsRule.inheritFromParent(value); 4553d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 4563d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mBottom.setFraction(value); 4573d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4583d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4593d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 4603d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4613d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4623d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4633d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 464738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mBottom == null) { 465738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return 1f; 466738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 4673d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mBottom.getFraction(); 4683d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4693d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 4703d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4713d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 4723d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 4733d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 4743d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 4753d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_LEFT_ABSOLUTE} when the exact start/end position of scroll movement 4763d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 4773d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 4783103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Float> LEFT_FRACTION = 4793103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractionLeft") { 4803d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4813d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 4823d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mLeft == null) { 4833d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft = BoundsRule.inheritFromParent(value); 4843d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 4853d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mLeft.setFraction(value); 4863d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4873d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4883d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 4893d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4903d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 4913d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 4923d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 493738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mLeft == null) { 494738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return 0f; 495738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 4963d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mLeft.getFraction(); 4973d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 4983d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 4993d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 5003d9017263a760990ba79d5ebf3d1b6587e0bd311susnata /** 5013d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * Implementation of {@link Property} for overwriting the bottom attribute of 5023d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@link BoundsRule} associated with this {@link ChildDrawable}. This allows users to 5033d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * change the bounds rules as a percentage of parent size. This is preferable over 5043d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * {@see PROPERTY_RIGHT_ABSOLUTE} when the exact start/end position of scroll movement 5053d9017263a760990ba79d5ebf3d1b6587e0bd311susnata * isn't available at compile time. 5063d9017263a760990ba79d5ebf3d1b6587e0bd311susnata */ 5073103f63e99d47573823957f7aa34308555873221Aurimas Liutikas public static final Property<CompositeDrawable.ChildDrawable, Float> RIGHT_FRACTION = 5083103f63e99d47573823957f7aa34308555873221Aurimas Liutikas new Property<CompositeDrawable.ChildDrawable, Float>(Float.class, "fractoinRight") { 5093d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 5103d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public void set(CompositeDrawable.ChildDrawable obj, Float value) { 5113d9017263a760990ba79d5ebf3d1b6587e0bd311susnata if (obj.getBoundsRule().mRight == null) { 5123d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight = BoundsRule.inheritFromParent(value); 5133d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } else { 5143d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.getBoundsRule().mRight.setFraction(value); 5153d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 5163d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 5173d9017263a760990ba79d5ebf3d1b6587e0bd311susnata obj.recomputeBounds(); 5183d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 5193d9017263a760990ba79d5ebf3d1b6587e0bd311susnata 5203d9017263a760990ba79d5ebf3d1b6587e0bd311susnata @Override 5213d9017263a760990ba79d5ebf3d1b6587e0bd311susnata public Float get(CompositeDrawable.ChildDrawable obj) { 522738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu if (obj.getBoundsRule().mRight == null) { 523738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu return 1f; 524738deb3f9c75ea32dff1bf335753703e40e87f39Dake Gu } 5253d9017263a760990ba79d5ebf3d1b6587e0bd311susnata return obj.getBoundsRule().mRight.getFraction(); 5263d9017263a760990ba79d5ebf3d1b6587e0bd311susnata } 5273d9017263a760990ba79d5ebf3d1b6587e0bd311susnata }; 528df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata } 529df64e524a2bad079e6b0aa2d22c287f2c62aed82susnata} 530