关于沉浸式状态栏和透明化系统栏的官方说明
-
Immersive full-screen mode
To provide your app with a layout that fills the entire(全部的) screen,the new SYSTEM_UI_FLAG_IMMERSIVE flag for setSystemUIVisivility()(when combined(结合) with SYSTEM_UI_FLAG_HIDE_NAVIGATION enables a new immersivefull-screen mode.while immersive full-screen mode is enable, your activity continues to receive all touch events, The user can reveal(展现,披露) the system bars with an inward(向内的) swipe(挥击) along the region where the system bars normally appear. This clears the SYSTEM_UI_FIAG_HIDE_NAVIGATION flag (and the SYSTEM_UI_FIAG_FULL_SCREEN flag, if applied) so the system bars remain visiable. However, if you'd like the system bars to hide again after a few moments, you can instead use the SYSTEM_UI_FIAG_IMMERSIVE_STICKY flag.
-
Translucent(透明化) system bars
You can now make the system bars partially translucent with the themes,
Theme.Holo.NoActionBar.TranslucentDecor and Theme.Holo.NoActionBar.TranslucentDecor. By enabling translucent system bars, your layout will fill the area behind the system bars, so you must also enable fitsSystemWindows for the portion(部分) of your layout that should not be covered by the system bars.
If you're creating a custom theme, set one of these themes as the parent theme or include the windowTranslucentNavigation and windowTranslucentStatus style properties in your theme.
关于透明状态栏说明:透明状态栏就是状态栏的颜色和activity根布局颜色相同。
- 和图片颜色相同的透明状态栏
- 和根布局颜色相同的透明状态栏
颜色方式
colorMethod在 android studio 中,排列方式变成 project,然后生成 values-v19 文件夹和 values-v21 文件夹,在文件夹中新建 style.xml 文件,接着分别在不同的 style 中生成 theme
styles.jpg
values-v19/style.xml
<Style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavagation">true</item>
<item name="android:fitsSystemWindows">true</item>
</style>
values-v21/style.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">#31c27c</item>
<item name="android:fitsSystemWindows">true</item>
</style>
将 activity 的 theme 设置为 AppTheme
这个生成 Toast 会产生位移,可以使用 Toast.makeText(getApplicationContext(), "toast", Toast.LENGTH_SHORT).show();
图片方式
pictureMethodvalues-v19/style.xml
<Style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavagation">true</item>
<item name="android:fitsSystemWindows">true</item>
</style>
values-v21/style.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:fitsSystemWindows">true</item>
</style>
其实图片方法和颜色方法殊途同归,可以直接使用相同的 <item name="android:statusBarColor">@android:color/transparent</item>
来使用
除了在 values-v19 和 values-v21 的 style.xml 中使用 fitsSystemWindows 属性,还可以直接在根部局中加上 android:fitsSystemWindows="true"
属性,这个方法就没有 toast 位移的问题,但是需要在每一个activity的根布局中加入这个属性,比较麻烦,我们还可以使用以下方法来解决重复书写 fitsSystemWindows:
-
新建一个TranslucentBarBaseActivity
public abstract class TranslucentBarBaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(getLayoutResId());//把设置布局文件的操作交给继承的子类 ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT); View parentView = contentFrameLayout.getChildAt(0); if (parentView != null && Build.VERSION.SDK_INT >= 14) { parentView.setFitsSystemWindows(true); } } /** * 返回当前Activity布局文件的id * *@return */ abstract protected int getLayoutResId(); }
然后主 activiy 继承此 activiy,就可以了。
以上文档引用自 Android开发:Translucent System Bar 的最佳实践
TranslucentBarDemo 中可以看到代码
网友评论