FrameLayout.java revision 9c9573721140c260d4614c7ac58923dcfa0cea22
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.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 27958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackbornimport android.view.ViewDebug; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.RemoteViews.RemoteView; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329c9573721140c260d4614c7ac58923dcfa0cea22Romain Guyimport java.util.ArrayList; 339c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FrameLayout is designed to block out an area on the screen to display 37606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * a single item. You can add multiple children to a FrameLayout and control their 38606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * position within the FrameLayout using {@link android.widget.FrameLayout.LayoutParams#gravity}. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Children are drawn in a stack, with the most recently added child on top. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of the frame layout is the size of its largest child (plus padding), visible 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or not (if the FrameLayout's parent permits). Views that are GONE are used for sizing 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only if {@link #setMeasureAllChildren(boolean) setConsiderGoneChildrenWhenMeasuring()} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is set to true. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class FrameLayout extends ViewGroup { 519c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy private static final int DEFAULT_CHILD_GRAVITY = Gravity.TOP | Gravity.LEFT; 529c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 53bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "measurement") 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mMeasureAllChildren = false; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mForeground; 58bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 59bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingLeft = 0; 61bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 62bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingTop = 0; 64bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 65bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingRight = 0; 67bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 68bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "padding") 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundPaddingBottom = 0; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mSelfBounds = new Rect(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mOverlayBounds = new Rect(); 73bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev 74bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mForegroundGravity = Gravity.FILL; 76883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen 77883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen /** {@hide} */ 78bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 79883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen protected boolean mForegroundInPadding = true; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn boolean mForegroundBoundsChanged = false; 82958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 839c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy private final ArrayList<View> mMatchParentChildren = new ArrayList<View>(1); 849c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context, AttributeSet attrs) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout(Context context, AttributeSet attrs, int defStyle) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyle, 0); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundGravity = a.getInt( 100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project com.android.internal.R.styleable.FrameLayout_foregroundGravity, mForegroundGravity); 101105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable d = a.getDrawable(com.android.internal.R.styleable.FrameLayout_foreground); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setForeground(d); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.getBoolean(com.android.internal.R.styleable.FrameLayout_measureAllChildren, false)) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasureAllChildren(true); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundInPadding = a.getBoolean( 112105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project com.android.internal.R.styleable.FrameLayout_foregroundInsidePadding, true); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes how the foreground is positioned. Defaults to FILL. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param foregroundGravity See {@link android.view.Gravity} 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setForegroundGravity(int foregroundGravity) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForegroundGravity != foregroundGravity) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((foregroundGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foregroundGravity |= Gravity.LEFT; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foregroundGravity |= Gravity.TOP; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundGravity = foregroundGravity; 136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForegroundGravity == Gravity.FILL && mForeground != null) { 139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Rect padding = new Rect(); 140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForeground.getPadding(padding)) { 141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = padding.left; 142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = padding.top; 143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = padding.right; 144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = padding.bottom; 145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = 0; 148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = 0; 149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = 0; 150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = 0; 151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.verifyDrawable(who) || (who == mForeground); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 165e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 166e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 167e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 168e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mForeground != null) mForeground.jumpToCurrentState(); 169e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 170e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null && mForeground.isStateful()) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground.setState(getDrawableState()); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a set of layout parameters with a width of 184980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}, 185980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * and a height of {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}. 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LayoutParams generateDefaultLayoutParams() { 189980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Supply a Drawable that is to be rendered on top of all of the child 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views in the frame layout. Any padding in the Drawable will be taken 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into account by ensuring that the children are inset to be placed 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inside of the padding area. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param drawable The Drawable to be drawn on top of the children. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setForeground(Drawable drawable) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != drawable) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground.setCallback(null); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unscheduleDrawable(mForeground); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForeground = drawable; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingLeft = 0; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingTop = 0; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingRight = 0; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mForegroundPaddingBottom = 0; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(false); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable.setCallback(this); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable.isStateful()) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project drawable.setState(getDrawableState()); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 221105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mForegroundGravity == Gravity.FILL) { 222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Rect padding = new Rect(); 223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (drawable.getPadding(padding)) { 224105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingLeft = padding.left; 225105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingTop = padding.top; 226105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingRight = padding.right; 227105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mForegroundPaddingBottom = padding.bottom; 228105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the drawable used as the foreground of this FrameLayout. The 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * foreground drawable, if non-null, is always drawn on top of the children. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Drawable or null if no foreground was set. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getForeground() { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mForeground; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 2539c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int count = getChildCount(); 2549c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 2559c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final boolean measureMatchParentChildren = 2569c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY || 2579c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY; 2589c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mMatchParentChildren.clear(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxHeight = 0; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxWidth = 0; 262189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn int childState = 0; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMeasureAllChildren || child.getVisibility() != GONE) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth = Math.max(maxWidth, child.getMeasuredWidth()); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight = Math.max(maxHeight, child.getMeasuredHeight()); 270189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn childState = combineMeasuredStates(childState, child.getMeasuredState()); 2719c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (measureMatchParentChildren) { 2729c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final ViewGroup.LayoutParams lp = child.getLayoutParams(); 2739c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.width == LayoutParams.MATCH_PARENT || 2749c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.height == LayoutParams.MATCH_PARENT) { 2759c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mMatchParentChildren.add(child); 2769c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 2779c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Account for padding too 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth += mPaddingLeft + mPaddingRight + mForegroundPaddingLeft + mForegroundPaddingRight; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight += mPaddingTop + mPaddingBottom + mForegroundPaddingTop + mForegroundPaddingBottom; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check against our minimum height and width 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight()); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth()); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check against our foreground's minimum height and width 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable drawable = getForeground(); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable != null) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxHeight = Math.max(maxHeight, drawable.getMinimumHeight()); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxWidth = Math.max(maxWidth, drawable.getMinimumWidth()); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 296189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), 297189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn resolveSizeAndState(maxHeight, heightMeasureSpec, 2989c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childState << MEASURED_HEIGHT_STATE_SHIFT)); 2999c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3009c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (mMatchParentChildren.size() > 0) { 3019c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy count = mMatchParentChildren.size(); 3029c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy for (int i = 0; i < count; i++) { 3039c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final View child = mMatchParentChildren.get(i); 3049c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3059c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); 3069c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childWidthMeasureSpec; 3079c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childHeightMeasureSpec; 3089c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3099c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.width == LayoutParams.MATCH_PARENT) { 3109c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth() - 3119c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingLeft - mPaddingRight - lp.leftMargin - lp.rightMargin, 3129c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.EXACTLY); 3139c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } else { 3149c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 3159c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin, 3169c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.width); 3179c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3189c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3199c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy if (lp.height == LayoutParams.MATCH_PARENT) { 3209c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() - 3219c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingTop - mPaddingBottom - lp.topMargin - lp.bottomMargin, 3229c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy MeasureSpec.EXACTLY); 3239c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } else { 3249c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy childHeightMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 3259c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin, 3269c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy lp.height); 3279c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3289c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy 3299c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 3309c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3319c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = getChildCount(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentLeft = mPaddingLeft + mForegroundPaddingLeft; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentRight = right - left - mPaddingRight - mForegroundPaddingRight; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentTop = mPaddingTop + mForegroundPaddingTop; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int parentBottom = bottom - top - mPaddingBottom - mForegroundPaddingBottom; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 347958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = true; 348958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.getVisibility() != GONE) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int width = child.getMeasuredWidth(); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int height = child.getMeasuredHeight(); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childLeft; 3589c9573721140c260d4614c7ac58923dcfa0cea22Romain Guy int childTop; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3605e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell int gravity = lp.gravity; 3615e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell if (gravity == -1) { 3625e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell gravity = DEFAULT_CHILD_GRAVITY; 3635e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3655e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell final int horizontalGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; 3665e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; 3675e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell 3685e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell switch (horizontalGravity) { 3695e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.LEFT: 3705e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + lp.leftMargin; 3715e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3725e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.CENTER_HORIZONTAL: 3735e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + (parentRight - parentLeft - width) / 2 + 3745e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell lp.leftMargin - lp.rightMargin; 3755e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3765e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.RIGHT: 3775e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentRight - width - lp.rightMargin; 3785e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3795e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell default: 3805e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childLeft = parentLeft + lp.leftMargin; 3815e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell } 3825e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell 3835e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell switch (verticalGravity) { 3845e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.TOP: 3855e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + lp.topMargin; 3865e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3875e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.CENTER_VERTICAL: 3885e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + (parentBottom - parentTop - height) / 2 + 3895e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell lp.topMargin - lp.bottomMargin; 3905e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3915e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell case Gravity.BOTTOM: 3925e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentBottom - height - lp.bottomMargin; 3935e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell break; 3945e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell default: 3955e0ae6765619724f58f4da631e5f40b24b69c089Adam Powell childTop = parentTop + lp.topMargin; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.layout(childLeft, childTop, childLeft + width, childTop + height); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onSizeChanged(w, h, oldw, oldh); 409958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = true; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.draw(canvas); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mForeground != null) { 420958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn final Drawable foreground = mForeground; 42182f3495b146b267f3786997752cef25310176349Romain Guy 422958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn if (mForegroundBoundsChanged) { 423958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn mForegroundBoundsChanged = false; 42482f3495b146b267f3786997752cef25310176349Romain Guy final Rect selfBounds = mSelfBounds; 42582f3495b146b267f3786997752cef25310176349Romain Guy final Rect overlayBounds = mOverlayBounds; 426958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 42782f3495b146b267f3786997752cef25310176349Romain Guy final int w = mRight-mLeft; 42882f3495b146b267f3786997752cef25310176349Romain Guy final int h = mBottom-mTop; 42982f3495b146b267f3786997752cef25310176349Romain Guy 43082f3495b146b267f3786997752cef25310176349Romain Guy if (mForegroundInPadding) { 43182f3495b146b267f3786997752cef25310176349Romain Guy selfBounds.set(0, 0, w, h); 43282f3495b146b267f3786997752cef25310176349Romain Guy } else { 43382f3495b146b267f3786997752cef25310176349Romain Guy selfBounds.set(mPaddingLeft, mPaddingTop, w - mPaddingRight, h - mPaddingBottom); 434958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 43582f3495b146b267f3786997752cef25310176349Romain Guy 43682f3495b146b267f3786997752cef25310176349Romain Guy Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(), 43782f3495b146b267f3786997752cef25310176349Romain Guy foreground.getIntrinsicHeight(), selfBounds, overlayBounds); 43882f3495b146b267f3786997752cef25310176349Romain Guy foreground.setBounds(overlayBounds); 439958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn } 440958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn 441958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn foreground.draw(canvas); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean gatherTransparentRegion(Region region) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean opaque = super.gatherTransparentRegion(region); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (region != null && mForeground != null) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applyDrawableToTransparentRegion(mForeground, region); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return opaque; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether to measure all children or just those in 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the VISIBLE or INVISIBLE state when measuring. Defaults to false. 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param measureAll true to consider children marked GONE, false otherwise. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default value is false. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @android.view.RemotableViewMethod 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMeasureAllChildren(boolean measureAll) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMeasureAllChildren = measureAll; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Determines whether to measure all children or just those in 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the VISIBLE or INVISIBLE state when measuring. 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getConsiderGoneChildrenWhenMeasuring() { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMeasureAllChildren; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new FrameLayout.LayoutParams(getContext(), attrs); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p instanceof LayoutParams; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(p); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Per-child layout information for layouts that support margins. 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#FrameLayout_Layout FrameLayout Layout Attributes} 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a list of all child view attributes that this class supports. 503606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * 504606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams extends MarginLayoutParams { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The gravity to apply with the View to which these layout parameters 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are associated. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.Gravity 512606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * 513606e8cca6ac0e9a65a1a92003511b7c66d9ea439Romain Guy * @attr ref android.R.styleable#FrameLayout_Layout_layout_gravity 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int gravity = -1; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(c, attrs); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = c.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout_Layout); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int width, int height) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(width, height); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new set of layout parameters with the specified width, height 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and weight. 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 539980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * @param width the width, either {@link #MATCH_PARENT}, 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WRAP_CONTENT} or a fixed size in pixels 541980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * @param height the height, either {@link #MATCH_PARENT}, 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WRAP_CONTENT} or a fixed size in pixels 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param gravity the gravity 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.Gravity 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int width, int height, int gravity) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(width, height); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.gravity = gravity; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.LayoutParams source) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.MarginLayoutParams source) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 568