2.1.2 Android劉海屏適配

屏幕適配-Android9.0官方劉海屏適配策略

  • 如果非全屏模式(有狀態欄),則app不受劉海屏的影響,劉海屏的高就是狀態欄的高
  • 如果全屏模式,app位適配劉海屏,系統會對界面做特殊處理,豎屏向下移動,橫屏向右移動

Google在Android9.0推出了劉海屏適配的方案,Android9.0以後,採用此方案即可。

全屏模式下,如何讓界面延伸進劉海

判斷手機是否是劉海屏

	private boolean hasDisplayCutout(Window window) {
		   DisplayCutout displayCutout;
		   View rootView = window.getDecorView();
		   WindowInsets insets = rootView.getRootWindowInsets();
		   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && insets != null){
		       displayCutout = insets.getDisplayCutout();
		       if (displayCutout != null){
		           if (displayCutout.getBoundingRects() != null && displayCutout.getBoundingRects().size() > 0 && displayCutout.getSafeInsetTop() > 0){
		               return true;
		           }
		       }
		   }
		   return false; //模擬器,這裏設置成true
	}

讓內容區域延伸進劉海

WindowManager.LayoutParams params = window.getAttributes();
/**
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 全屏模式,內容下移,非全屏不受影響
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允許內容去延伸進劉海區
 *  * @see #LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允許內容延伸進劉海區
 */
params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
window.setAttributes(params);

設置成沉浸式

int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int visibility = window.getDecorView().getSystemUiVisibility();
visibility |= flags; //追加沉浸式設置
window.getDecorView().setSystemUiVisibility(visibility);  

設置控件是否避開劉海區域,避免Button等控件被劉海屏遮蓋
在這裏插入圖片描述

//通常情況下,劉海的高就是狀態欄的高
public int heightForDisplayCutout(){
    int resID = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resID > 0){
        return getResources().getDimensionPixelSize(resID);
    }
    return 96;
}  

可以設置Button等空間的Margin

Button button = findViewById(R.id.button);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) button.getLayoutParams();
layoutParams.topMargin = heightForDisplayCutout();
button.setLayoutParams(layoutParams);  

也可以設置界面的Padding

RelativeLayout layout = findViewById(R.id.container);
    layout.setPadding(layout.getPaddingLeft(), heightForDisplayCutout(), layout.getPaddingRight(), layout.getPaddingBottom());   

屏幕適配 - 劉海屏適配 - 其他手機廠商(華爲,小米,oppo,vivo)適配

對於Android9.0之前,國內廠商有各色各樣的適配方案,詳見各廠商官方文檔。
華爲:https://developer.huawei.com/consumer/cn/devservice/doc/50114
小米:https://dev.mi.com/console/doc/detail?pId=1293
Oppo:https://open.oppomobile.com/service/message/detail?id=61876
Vivo:https://dev.vivo.com.cn/documentCenter/doc/103

GitHub上已封裝好的劉海屏適配方案

https://github.com/zhangzhun132/NotchTools

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章