1. 程式人生 > >android 控制元件的大小計算以及自適應螢幕的大小

android 控制元件的大小計算以及自適應螢幕的大小

由於android 的螢幕解析度較多導致佈局的時候控制元件有時會被拉伸,導致和原來的效果差別很大 ,這個時候就需要根據不同的螢幕來調節控制元件的大小,例如想要為CheckBox的控制元件根據螢幕設定大小

 <LinearLayout
        android:id="@+id/ll_awaken_repeat_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_horizontal"
        android:layout_marginTop="@dimen/spacing_middle"
        android:layout_below="@+id/ll_layout"
        android:layout_alignParentStart="true">

        <TextView
            android:id="@+id/tv_week_repeat_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/alarm_repeat"
            android:layout_marginLeft="@dimen/dp_30"
            android:textSize="@dimen/font_16"
            android:textColor="#FFFFFF"  />


        <LinearLayout
            android:gravity="center_horizontal"
            android:id="@+id/ll_week_repeat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <CheckBox
                android:id="@+id/timing_turn_on_sunday"
                style="@style/timing_week_checkbox"
                android:text="@string/sunday" />

            <CheckBox
                android:id="@+id/timing_turn_on_monday"
                style="@style/timing_week_checkbox"
                android:text="@string/monday" />

            <CheckBox
                android:id="@+id/timing_turn_on_tuesday"
                style="@style/timing_week_checkbox"
                android:text="@string/tuesday" />

            <CheckBox
                android:id="@+id/timing_turn_on_wednesday"
                style="@style/timing_week_checkbox"
                android:text="@string/wednesday" />

            <CheckBox
                android:id="@+id/timing_turn_on_thursday"
                style="@style/timing_week_checkbox"
                android:text="@string/thursday" />

            <CheckBox
                android:id="@+id/timing_turn_on_friday"
                style="@style/timing_week_checkbox"
                android:text="@string/friday" />

            <CheckBox
                android:id="@+id/timing_turn_on_saturday"
                style="@style/timing_week_checkbox"
                android:text="@string/saturday" />
        </LinearLayout>
    </LinearLayout>

  1. 首先拿到當前螢幕的寬度
    mainView.getMeasuredWidth()

  2. 如果還有和這個控制元件並列的控制元件,也拿到並列的佈局
    //TextVeiw的寬度
            tv_week_repeat.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            int tvWeekRepeatWidth = tv_week_repeat.getMeasuredWidth();
    這個TextView佈局使用了一個 layout_marginLeft="30dp" 要將他轉換成螢幕解析度
    int tvWeekRepeatMarginLeft = getResources().getDimensionPixelOffset(R.dimen.dp_30);
    這個時候就可以用螢幕的寬度減去TextView的寬度再減去30dp的寬度
    int residual = mainView.getMeasuredWidth() - tvWeekRepeatWidth - tvWeekRepeatMarginLeft;
    就剩下包裹子控制元件的寬度了
  3. 根據需求CheckBox控制元件每個控制元件間隔10dp,7個控制元件就是8個間距然後再乘以7就是一個CheckBox的寬度了
    int everyCheckBoxWH = (int) ((residual-itemSpace*8)/7.0f);

  4. 計算出包裹CheckBox的控制元件個數
    int lens = ll_awaken_repeat_layout.getChildCount();

  5. 然後就可以為CheckBox控制元件賦大小了
     LinearLayout.LayoutParams lp = null;
            CheckBox cb = null;
            for (int i = 0; i < lens; i++) {
                cb = (CheckBox) ll_awaken_repeat_layout.getChildAt(i);
                lp = (LinearLayout.LayoutParams) cb.getLayoutParams();
                if(i == lens-1){//最後1個item靠在最有邊,讓他距離右邊<span style="font-family: Arial, Helvetica, sans-serif;">itemSpace距離</span>
    
                    lp.setMargins(itemSpace,0,itemSpace,0);
                } else {
                    lp.setMargins(itemSpace,0,0,0);//順序為左上右下
                }
                lp.width = everyCheckBoxWH;
                lp.height = everyCheckBoxWH;
    
                cb.setLayoutParams(lp);
            }