开发中,设计图照着苹果来的(/(ㄒoㄒ)/~~),导航栏颜色的设置直接影响美观和用户体验,kitkat4.4及其以下版本先不管,4.4以上版本还是很有希望实现的,且往下看。
准备工作:首先在res文件下新建一个values-v21文件夹,在该文件下新建一个style.xml文件,style.xml文件里的所有属性都是针对api21及其以上版本设置的。
设置顶部透明状态栏:
<item name="android:windowTranslucentStatus">true</item>
看效果:
可以看到设置该属性后,界面被拉伸到顶部。
如果想要代码动态设置,效果一样的:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
window.setAttributes(attributes);
}
去除顶部灰色阴影:
android:windowTranslucentStatus 属性并不能完美呈现出像ios应用的导航栏效果,顶部多了层灰色半透明阴影,如何去掉这个效果奈,看下面代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.setStatusBarColor(Color.TRANSPARENT)
}
效果图:
解决置顶问题:
上面的设置会导致布局整体拉伸到状态栏顶部,就像第一张图一样,这并不是我们想要的效果。如果能够获取状态栏的高度,设置对应控件的paddingTop,问题不就可以解决了嘛。
1、获取状态栏高度
由于每个手机分辨率不一样,状态栏的高度肯定不能设置成一个固定值,只能动态获取了:
public int getStatusBarHeight() {
int result = 0;
int resourceId = getContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getContext().getResources().getDimensionPixelSize(resourceId);
}
return result;
}
2、动态设置paddingTop
final ViewGroup linear_bar = (ViewGroup) activity.findViewById(title_id); // 所需要设置控件
linear_bar.post(new Runnable() {
@Override
public void run() {
linear_bar.setPadding(0, getStatusBarHeight(activity), 0, 0);
}
});
效果图:
设置底部导航栏透
明:
<item name="android:windowTranslucentNavigation">true</item>
效果图:
代码设置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
window.setAttributes(attributes);
}
关于源码,请戳https://github.com/jjjSilence/jjjPlus ,在白天/ 夜晚切换里面O(∩_∩)O