Android 全面屏的那些适配方法

版权申明:未经允许请勿转载。转载前请先联系作者([email protected]

原本以为只是很简单的功能。虽然最后发现确实是简单的功能。
但是前前后的调整接近一天,这里留下记录,如何处理吧。

一、无边界的屏幕

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // transparent-status-bar: https://stackoverflow.com/a/31596735
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}

使用上面的设置之后,状态栏(status-bar)和虚拟导航栏(Navigation)就都透明得盖在内容之上,屏幕可操作区域延伸到最大,不管是全面屏还是普通屏的手机。

二、三星的全面屏幕

<application>
	...
	<meta-data
	    android:name="android.max_aspect"
	    android:value="2.4" />
application>

2.1 三星的全面屏幕+隐藏状态栏(transparent status-bar)+特殊颜色虚拟导航栏(Navigation)

2.1.1 工具类
public static void cutoutScreenMode(final Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
        activity.getWindow().setAttributes(lp);
    }
}
public static void transparentStatusBar(final Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent));
    }
    View view = activity.getWindow().getDecorView();
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        view.setSystemUiVisibility(View.GONE);
    } else {
        int uiOptions = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        view.setSystemUiVisibility(uiOptions);
    }
}
2.1.2 如何调用

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
	NavigationUtil.transparentStatusBar(this);
    NavigationUtil.cutoutScreenMode(this);
}

AndroidMainfest.xml

<application>
	...
	<activity
	    android:name=".MainActivity"
	    android:screenOrientation="portrait"
	    android:theme="@style/AppTheme.FullScreenWithDarkNavigation">
	activity>
application>        

styles.xml

<style name="AppTheme.FullScreenWithDarkNavigation">
    "android:windowFullscreen">true
    "android:windowContentOverlay">@null
    "android:navigationBarColor" tools:ignore="NewApi">@color/colorBackground
style>
2.1.3 小结
  1. 通过设定主题,改变单Activity的navigationBarColor。
  2. 使用transparentStatusBar中的设置,将状态栏透明化
  3. 使用cutoutScreenMode中的设置,把显示区域最大化

2.2 三星的全面屏幕+隐藏状态栏(transparent status-bar)+ 隐藏虚拟导航栏(Navigation)

2.2.1 工具类
public static void hideSystemNavigationBar(final Activity activity) {
    View view = activity.getWindow().getDecorView();
    if (Build.VERSION.SDK_INT < 19) {
        view.setSystemUiVisibility(View.GONE);
    } else {
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        view.setSystemUiVisibility(uiOptions);
    }
}
2.2.2 如何调用

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
	NavigationUtil.hideSystemNavigationBar(this);
    NavigationUtil.cutoutScreenMode(this);
}

三、小结

可以看到,这些大多是系统预留的设置,实际上查查API文档就能知道怎么设置。
留这篇文章是因为API文档看了之后云里雾里 : ( 。
看stackoverflow上的回答好像也不能如愿。
找了许久终于摸清楚设置,所以留下方法。

玩~

你可能感兴趣的:(Android)