android 控制元件的大小計算以及自適應螢幕的大小
阿新 • • 發佈:2019-01-28
由於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>
- 首先拿到當前螢幕的寬度
mainView.getMeasuredWidth()
- 如果還有和這個控制元件並列的控制元件,也拿到並列的佈局
這個TextView佈局使用了一個 layout_marginLeft="30dp" 要將他轉換成螢幕解析度//TextVeiw的寬度 tv_week_repeat.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int tvWeekRepeatWidth = tv_week_repeat.getMeasuredWidth();
這個時候就可以用螢幕的寬度減去TextView的寬度再減去30dp的寬度int tvWeekRepeatMarginLeft = getResources().getDimensionPixelOffset(R.dimen.dp_30);
就剩下包裹子控制元件的寬度了int residual = mainView.getMeasuredWidth() - tvWeekRepeatWidth - tvWeekRepeatMarginLeft;
- 根據需求CheckBox控制元件每個控制元件間隔10dp,7個控制元件就是8個間距然後再乘以7就是一個CheckBox的寬度了
int everyCheckBoxWH = (int) ((residual-itemSpace*8)/7.0f);
- 計算出包裹CheckBox的控制元件個數
int lens = ll_awaken_repeat_layout.getChildCount();
- 然後就可以為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); }