FrameLayout.java revision 82f3495b146b267f3786997752cef25310176349
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
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FrameLayout is designed to block out an area on the screen to display
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a single item. You can add multiple children to a FrameLayout, but all
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children are pegged to the top left of the screen.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Children are drawn in a stack, with the most recently added child on top.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of the frame layout is the size of its largest child (plus padding), visible
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or not (if the FrameLayout's parent permits). Views that are GONE are used for sizing
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only if {@link #setMeasureAllChildren(boolean) setConsiderGoneChildrenWhenMeasuring()}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is set to true.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foreground
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_foregroundGravity
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#FrameLayout_measureAllChildren
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@RemoteView
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class FrameLayout extends ViewGroup {
49958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mMeasureAllChildren = false;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mForeground;
54958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingLeft = 0;
56958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingTop = 0;
58958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingRight = 0;
60958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundPaddingBottom = 0;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Rect mSelfBounds = new Rect();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Rect mOverlayBounds = new Rect();
65958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mForegroundGravity = Gravity.FILL;
67883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen
68883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen    /** {@hide} */
69958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    @ViewDebug.ExportedProperty
70883e7eb389d55866f329150f258a70104abb10d7Karl Rosaen    protected boolean mForegroundInPadding = true;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    boolean mForegroundBoundsChanged = false;
73958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context, AttributeSet attrs) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FrameLayout(Context context, AttributeSet attrs, int defStyle) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    defStyle, 0);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mForegroundGravity = a.getInt(
89105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                com.android.internal.R.styleable.FrameLayout_foregroundGravity, mForegroundGravity);
90105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Drawable d = a.getDrawable(com.android.internal.R.styleable.FrameLayout_foreground);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (d != null) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setForeground(d);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.getBoolean(com.android.internal.R.styleable.FrameLayout_measureAllChildren, false)) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setMeasureAllChildren(true);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mForegroundInPadding = a.getBoolean(
101105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                com.android.internal.R.styleable.FrameLayout_foregroundInsidePadding, true);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Describes how the foreground is positioned. Defaults to FILL.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param foregroundGravity See {@link android.view.Gravity}
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_foregroundGravity
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @android.view.RemotableViewMethod
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setForegroundGravity(int foregroundGravity) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForegroundGravity != foregroundGravity) {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((foregroundGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foregroundGravity |= Gravity.LEFT;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((foregroundGravity & Gravity.VERTICAL_GRAVITY_MASK) == 0) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foregroundGravity |= Gravity.TOP;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundGravity = foregroundGravity;
125105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
126105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
127105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mForegroundGravity == Gravity.FILL && mForeground != null) {
128105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                Rect padding = new Rect();
129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                if (mForeground.getPadding(padding)) {
130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingLeft = padding.left;
131105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingTop = padding.top;
132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingRight = padding.right;
133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mForegroundPaddingBottom = padding.bottom;
134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                }
135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            } else {
136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingLeft = 0;
137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingTop = 0;
138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingRight = 0;
139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mForegroundPaddingBottom = 0;
140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean verifyDrawable(Drawable who) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return super.verifyDrawable(who) || (who == mForeground);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void drawableStateChanged() {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.drawableStateChanged();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != null && mForeground.isStateful()) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForeground.setState(getDrawableState());
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a set of layout parameters with a width of
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.ViewGroup.LayoutParams#FILL_PARENT},
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and a height of {@link android.view.ViewGroup.LayoutParams#FILL_PARENT}.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected LayoutParams generateDefaultLayoutParams() {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Supply a Drawable that is to be rendered on top of all of the child
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views in the frame layout.  Any padding in the Drawable will be taken
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * into account by ensuring that the children are inset to be placed
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside of the padding area.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param drawable The Drawable to be drawn on top of the children.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_foreground
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setForeground(Drawable drawable) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != drawable) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mForeground != null) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mForeground.setCallback(null);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                unscheduleDrawable(mForeground);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForeground = drawable;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingLeft = 0;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingTop = 0;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingRight = 0;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mForegroundPaddingBottom = 0;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawable != null) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setWillNotDraw(false);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                drawable.setCallback(this);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (drawable.isStateful()) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    drawable.setState(getDrawableState());
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
204105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                if (mForegroundGravity == Gravity.FILL) {
205105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    Rect padding = new Rect();
206105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    if (drawable.getPadding(padding)) {
207105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingLeft = padding.left;
208105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingTop = padding.top;
209105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingRight = padding.right;
210105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                        mForegroundPaddingBottom = padding.bottom;
211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }  else {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setWillNotDraw(true);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the drawable used as the foreground of this FrameLayout. The
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * foreground drawable, if non-null, is always drawn on top of the children.
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A Drawable or null if no foreground was set.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getForeground() {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mForeground;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int maxHeight = 0;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int maxWidth = 0;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Find rightmost and bottommost child
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View child = getChildAt(i);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mMeasureAllChildren || child.getVisibility() != GONE) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                maxWidth = Math.max(maxWidth, child.getMeasuredWidth());
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                maxHeight = Math.max(maxHeight, child.getMeasuredHeight());
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Account for padding too
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxWidth += mPaddingLeft + mPaddingRight + mForegroundPaddingLeft + mForegroundPaddingRight;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxHeight += mPaddingTop + mPaddingBottom + mForegroundPaddingTop + mForegroundPaddingBottom;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check against our minimum height and width
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check against our foreground's minimum height and width
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Drawable drawable = getForeground();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawable != null) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec),
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resolveSize(maxHeight, heightMeasureSpec));
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int parentLeft = mPaddingLeft + mForegroundPaddingLeft;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int parentRight = right - left - mPaddingRight - mForegroundPaddingRight;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int parentTop = mPaddingTop + mForegroundPaddingTop;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int parentBottom = bottom - top - mPaddingBottom - mForegroundPaddingBottom;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
283958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        mForegroundBoundsChanged = true;
284958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View child = getChildAt(i);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (child.getVisibility() != GONE) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int width = child.getMeasuredWidth();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int height = child.getMeasuredHeight();
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int childLeft = parentLeft;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int childTop = parentTop;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int gravity = lp.gravity;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (gravity != -1) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int horizontalGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (horizontalGravity) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.LEFT:
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childLeft = parentLeft + lp.leftMargin;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.CENTER_HORIZONTAL:
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childLeft = parentLeft + (parentRight - parentLeft + lp.leftMargin +
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    lp.rightMargin - width) / 2;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.RIGHT:
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childLeft = parentRight - width - lp.rightMargin;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        default:
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childLeft = parentLeft + lp.leftMargin;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (verticalGravity) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.TOP:
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childTop = parentTop + lp.topMargin;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.CENTER_VERTICAL:
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childTop = parentTop + (parentBottom - parentTop + lp.topMargin +
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    lp.bottomMargin - height) / 2;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case Gravity.BOTTOM:
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childTop = parentBottom - height - lp.bottomMargin;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        default:
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            childTop = parentTop + lp.topMargin;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.layout(childLeft, childTop, childLeft + width, childTop + height);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onSizeChanged(w, h, oldw, oldh);
344958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        mForegroundBoundsChanged = true;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.draw(canvas);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mForeground != null) {
355958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            final Drawable foreground = mForeground;
35682f3495b146b267f3786997752cef25310176349Romain Guy
357958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            if (mForegroundBoundsChanged) {
358958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn                mForegroundBoundsChanged = false;
35982f3495b146b267f3786997752cef25310176349Romain Guy                final Rect selfBounds = mSelfBounds;
36082f3495b146b267f3786997752cef25310176349Romain Guy                final Rect overlayBounds = mOverlayBounds;
361958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
36282f3495b146b267f3786997752cef25310176349Romain Guy                final int w = mRight-mLeft;
36382f3495b146b267f3786997752cef25310176349Romain Guy                final int h = mBottom-mTop;
36482f3495b146b267f3786997752cef25310176349Romain Guy
36582f3495b146b267f3786997752cef25310176349Romain Guy                if (mForegroundInPadding) {
36682f3495b146b267f3786997752cef25310176349Romain Guy                    selfBounds.set(0, 0, w, h);
36782f3495b146b267f3786997752cef25310176349Romain Guy                } else {
36882f3495b146b267f3786997752cef25310176349Romain Guy                    selfBounds.set(mPaddingLeft, mPaddingTop, w - mPaddingRight, h - mPaddingBottom);
369958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn                }
37082f3495b146b267f3786997752cef25310176349Romain Guy
37182f3495b146b267f3786997752cef25310176349Romain Guy                Gravity.apply(mForegroundGravity, foreground.getIntrinsicWidth(),
37282f3495b146b267f3786997752cef25310176349Romain Guy                        foreground.getIntrinsicHeight(), selfBounds, overlayBounds);
37382f3495b146b267f3786997752cef25310176349Romain Guy                foreground.setBounds(overlayBounds);
374958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
375958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
376958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            foreground.draw(canvas);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean gatherTransparentRegion(Region region) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean opaque = super.gatherTransparentRegion(region);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (region != null && mForeground != null) {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applyDrawableToTransparentRegion(mForeground, region);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return opaque;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determines whether to measure all children or just those in
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the VISIBLE or INVISIBLE state when measuring. Defaults to false.
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measureAll true to consider children marked GONE, false otherwise.
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default value is false.
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#FrameLayout_measureAllChildren
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @android.view.RemotableViewMethod
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMeasureAllChildren(boolean measureAll) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMeasureAllChildren = measureAll;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Determines whether to measure all children or just those in
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the VISIBLE or INVISIBLE state when measuring.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getConsiderGoneChildrenWhenMeasuring() {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMeasureAllChildren;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public LayoutParams generateLayoutParams(AttributeSet attrs) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new FrameLayout.LayoutParams(getContext(), attrs);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p instanceof LayoutParams;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new LayoutParams(p);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Per-child layout information for layouts that support margins.
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See {@link android.R.styleable#FrameLayout_Layout FrameLayout Layout Attributes}
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for a list of all child view attributes that this class supports.
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class LayoutParams extends MarginLayoutParams {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The gravity to apply with the View to which these layout parameters
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * are associated.
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see android.view.Gravity
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int gravity = -1;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(Context c, AttributeSet attrs) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(c, attrs);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TypedArray a = c.obtainStyledAttributes(attrs, com.android.internal.R.styleable.FrameLayout_Layout);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.recycle();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(int width, int height) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(width, height);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Creates a new set of layout parameters with the specified width, height
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and weight.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param width the width, either {@link #FILL_PARENT},
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        {@link #WRAP_CONTENT} or a fixed size in pixels
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param height the height, either {@link #FILL_PARENT},
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        {@link #WRAP_CONTENT} or a fixed size in pixels
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param gravity the gravity
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @see android.view.Gravity
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(int width, int height, int gravity) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(width, height);
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.gravity = gravity;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(ViewGroup.LayoutParams source) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@inheritDoc}
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public LayoutParams(ViewGroup.MarginLayoutParams source) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499