沉浸式状态栏:
先看效果:
后面会给出源码地址。
首先需要先把状态栏变透明,变透明后,布局会自动的占据状态栏。
沉浸纯颜色可以采取a, b 2种方式,
a方法:给根布局加
android:fitsSystemWindows="true" //取消占据状态栏然后在代码中往状态栏加入一个我们需要的纯颜色的view:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
transparentStatusBar();
}
private void transparentStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0及以上
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//4.4到5.0
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);
}
addStatusBarView();
}
private void addStatusBarView() {
View view = new View(this);
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(this));
ViewGroup decorView = (ViewGroup) findViewById(android.R.id.content);
decorView.addView(view, params);
}
public int getStatusBarHeight(Context context) {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
}
(看不懂代码你就直接复制过去用就行了,无关紧要)
这样状态栏就沉浸成了我们需要的颜色,这个颜色一般跟toolbar相同所以后面的toolbar的颜色一般也设置为同样颜色。
此时如果沉浸的是图片,就不需要往状态栏里加view,只需要把状态栏变透明即可,即注释掉
addStatusBarView();
就可以了。但是这张图片是根布局的背景才有效。是根布局的子View的背景会渗透无效。
b方法:
先让状态栏变透明
但不在根布局加
android:fitsSystemWindows="true"也就是占据状态栏,这时如果不做处理界面会显得唐突,
所以如果后面是toolbar,需要给toolbar加上paddingTop,一般为25dp。(25dp就是手机状态栏的高度,不同手机可能有微量差别)
<android.support.v7.widget.Toolbar
android:paddingTop="@dimen/paddingTop" //一般为25dp
android:layout_width="match_parent"
android:layout_height="75dp"
android:background="@color/colorPrimary"
app:title="沉浸式状态栏">
</android.support.v7.widget.Toolbar>
b方法如果沉浸的是图片,则不需要任何多余的处理,就可以达到沉浸的目的。但需要注意,因为此时不加fitsSystemWindows是占据了状态栏,所以布局会偏上,所以其他控件要留个marginTop,所处位置才会正常。
<TextView
android:layout_marginTop="25dp"
android:background="@color/colorAccent"
android:text="12312"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
总结:
不管根布局有没有加
android:fitsSystemWindows="true"只要已经将状态栏设置为透明,状态栏都会沉浸根布局的背景颜色或背景图片。
建议使用不加fitSystemWindows的方法,处理沉浸纯颜色和图片都比较方便。
将状态栏变透明除了用代码还可以通过主题来修改,需要在values、values-v19、values-v21目录下分别创建相应的主题:
//values
<stylename="TranslucentTheme"parent="AppTheme"></style>
//values-v19
<stylename="TranslucentTheme"parent="Theme.AppCompat.Light.NoActionBar">
<itemname="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>
//values-v21
<stylename="TranslucentTheme"parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
给相应Activity或Application设置该主题就ok了。
示例项目地址:https://github.com/SureCoder/MyMaterialDesignDemo
如果能够帮助到你,希望你能点个赞或者给个星星呗!