WeightedLinearLayout.java revision d60d3742abe4e6c51681276713bbd68a3e21f04e
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.widget;
18
19import android.content.Context;
20import android.content.res.TypedArray;
21import android.util.AttributeSet;
22import android.util.DisplayMetrics;
23import android.widget.LinearLayout;
24
25import static android.view.View.MeasureSpec.*;
26import static com.android.internal.R.*;
27
28/**
29 * A special layout when measured in AT_MOST will take up a given percentage of
30 * the available space.
31 */
32public class WeightedLinearLayout extends LinearLayout {
33    private float mMajorWeight;
34    private float mMinorWeight;
35
36    public WeightedLinearLayout(Context context) {
37        super(context);
38    }
39
40    public WeightedLinearLayout(Context context, AttributeSet attrs) {
41        super(context, attrs);
42
43        TypedArray a =
44            context.obtainStyledAttributes(attrs, styleable.WeightedLinearLayout);
45
46        mMajorWeight = a.getFloat(styleable.WeightedLinearLayout_majorWeight, 0.0f);
47        mMinorWeight = a.getFloat(styleable.WeightedLinearLayout_minorWeight, 0.0f);
48
49        a.recycle();
50    }
51
52    @Override
53    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
54        final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
55        final int screenWidth = metrics.widthPixels;
56        final boolean isPortrait = screenWidth < metrics.heightPixels;
57
58        final int widthMode = getMode(widthMeasureSpec);
59
60        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
61
62        int width = getMeasuredWidth();
63        int height = getMeasuredHeight();
64        boolean measure = false;
65
66        widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY);
67        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, EXACTLY);
68
69        final float widthWeight = isPortrait ? mMinorWeight : mMajorWeight;
70        if (widthMode == AT_MOST && widthWeight > 0.0f) {
71            if (width < (screenWidth * widthWeight)) {
72                widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (screenWidth * widthWeight),
73                        EXACTLY);
74                measure = true;
75            }
76        }
77
78        // TODO: Support height?
79
80        if (measure) {
81            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
82        }
83    }
84}
85