Android開發(fā)中不得不了解知識點
對于這樣的布局,我們可以用GridView控件或RecyclerView控件來實現,提倡用RecyclerView控件來實現了。一屏顯示16個應用,這樣就需要和屏幕的知識點聯系上了。
1、獲取頂部status bar 高度
- /**
- * 獲取頂部status bar 高度
- */
- private int getStatusBarHeight() {
- Resources resources = mActivity.getResources();
- int resourceId = resources.getIdentifier("status_bar_height", "dimen","android");
- int height = resources.getDimensionPixelSize(resourceId);
- Log.v("dbw", "Status height:" + height);
- return height;
- }
2、獲取底部 navigation bar 高度
- private int getNavigationBarHeight() {
- Resources resources = mActivity.getResources();
- int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android");
- int height = resources.getDimensionPixelSize(resourceId);
- Log.v("dbw", "Navi height:" + height);
- return height;
- }
這里對于底部,我們得花點心思,華為手機自帶下面有底部導航。我們要先通過判斷設備是否有返回鍵、菜單鍵(不是虛擬鍵,是手機屏幕外的按鍵)來確定是否有navigation bar
(已驗證可行)。主要是KeyEvent.KEYCODE_BACK和hasPermanentMenuKey
- @SuppressLint("NewApi")
- public static boolean checkDeviceHasNavigationBar(Context activity) {
- boolean hasMenuKey = ViewConfiguration.get(activity)
- .hasPermanentMenuKey();
- boolean hasBackKey = KeyCharacterMap
- .deviceHasKey(KeyEvent.KEYCODE_BACK);
- if (!hasMenuKey && !hasBackKey) {
- // 這個設備有一個導航欄
- return true;
- }
- return false;
- }
我們要獲取屏幕的總高度減去 頂部高度和底部導航的高度(設備存在底部導航),如果你的屏幕還有其他控件,也要一起減去,再平均四等分。這樣我們的RecyclerView的每個itemView才能均等。
3、屏幕高度
- DisplayMetrics displayMetrics = new DisplayMetrics();
- Activity activity = (Activity) mContext;
- activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
- LayoutParams layoutParams = holder.itemView.getLayoutParams();
- layoutParams.height = (displayMetrics.heightPixels - topHeight)/4;
- holder.itemView.setLayoutParams(layoutParams);
其中topHeight為頂部、導航和其他控件的總高度。這樣就能實現我們的需求了。
【本文為51CTO專欄作者“洪生鵬”的原創(chuàng)稿件,轉載請聯系原作者】