废话省去,先来段热身代码:
//用于获取非window的view的bitmap(截图),下边方式可获得拓印式截图
decorView.setDrawingCacheEnabled(true);
Bitmap drawingCache = decorView.getDrawingCache();
//可用于获得window的拓印截图
View decorView1 = getWindow().getDecorView(); ---得到拓印模板
Bitmap bitmap = Bitmap.createBitmap(33,33, Bitmap.Config.RGB_565);
decorView1.draw(new Canvas(bitmap));---开始拓印到bitmap上
其中getDecorView只用于获取window的View,而setSystemUiVisibility适用于所有View;
setSystemUiVisibility(int visibility)方法可传入的实参为:
1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态栏的正常情况)。
2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键代替物理按键。
8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
Android4.4新特性又增加下面俩个,全屏沉浸模式:
View.SYSTEM_UI_FLAG_IMMERSIVE
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
而在styles文件中相应配置为:
相关文章:猛戳这里
//用于获取非window的view的bitmap(截图),下边方式可获得拓印式截图
decorView.setDrawingCacheEnabled(true);
Bitmap drawingCache = decorView.getDrawingCache();
//可用于获得window的拓印截图
View decorView1 = getWindow().getDecorView(); ---得到拓印模板
Bitmap bitmap = Bitmap.createBitmap(33,33, Bitmap.Config.RGB_565);
decorView1.draw(new Canvas(bitmap));---开始拓印到bitmap上
要注意喽,代码设置方式:
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.system_flags_XXX);其中getDecorView只用于获取window的View,而setSystemUiVisibility适用于所有View;
setSystemUiVisibility(int visibility)方法可传入的实参为:
1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态栏的正常情况)。
2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键代替物理按键。
8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
Android4.4新特性又增加下面俩个,全屏沉浸模式:
View.SYSTEM_UI_FLAG_IMMERSIVE
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
举例说明:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // View decorView = getWindow().getDecorView(); // int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; // decorView.setSystemUiVisibility(option); Window window = this.getWindow(); //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色 window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); //设置状态栏特定颜色 window.setStatusBarColor(Color.parseColor("#A20000")); ViewGroup mContentView = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT); View mChildView = mContentView.getChildAt(0); if (mChildView != null) { //注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . 预留出系统 View 的空间. ViewCompat.setFitsSystemWindows(mChildView, true); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //设置状态栏透明且消失,contentView布局上移 // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //设置导航栏透明 // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }
还可以在AndroidManifest.xml中的application或Activity中设置:
<application
android:name=".Myapp"
android:theme="@style/AppTheme">
而在styles文件中相应配置为:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowTranslucentStatus">true</item> 设为true时表状态栏透明,此时若
<item name="android:fitsSystemWindows">true</item>,状态栏颜色是contentView最外层布局的背景色,若
<item name="android:fitsSystemWindows">false</item>,则状态栏本身彻底消失,contentView布局向上平移替代;
<item name="android:windowTranslucentStatus">false</item> 设为false时表状态栏不透明,这也是默认情况
<item name="android:fitsSystemWindows">true</item>,状态栏颜色为设置的颜色(或黑色);
</style>
<item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无
<item name="android:windowIsFloating">true</item>:是否浮现在activity之上
<item name="android:windowIsTranslucent">false</item>:是否半透明
<item name="android:windowBackground">@drawable/dia_bg</item>:设置dialog的背景
<item name="android:backgroundDimEnabled">false</item>: 背景是否模糊显示
<item name="android:backgroundDimAmount">0.9</item>
注意:
用这种:<item name="android:fitsSystemWindows">true</item> 是有缺陷的,比如:采用这样设置的appTheme会使得Toast显示文字偏上,并且padding失效,导致toast样式很丑;
两种保留状态栏且改变其颜色方案:
1、给每一个布局加上一定高度(25dp)的View替代状态栏;
2、重新计算状态栏高度,代码方式添加充当状态栏的View(推荐此方式);
方式2例子代码:
public abstract class StatusBarActivity extends AppCompatActivity {
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTranslucentStatus(true);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(0, getStatusBarHeight(), 0, 0);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layout.addView(getContentView(LayoutInflater.from(this)), lp);
setContentView(layout);
}
public abstract View getContentView(LayoutInflater layoutInflater);
@TargetApi(19)
private void setTranslucentStatus(boolean on) {
if (on && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
initStatusBar(R.color.primaryDark);
setStatusBarTextColor(1);
}
}
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 初始化状态栏
*
* @param color 状态栏颜色
*/
private void initStatusBar(int color) {
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setNavigationBarTintEnabled(true);
// tintManager.setStatusBarTintResource(color);
tintManager.setStatusBarTintColor(getResources().getColor(color));
}
/**
* 只支持MIUI V6
* @param type 0--只需要状态栏透明 1-状态栏透明且黑色字体 2-清除黑色字体
*/
private void setStatusBarTextColor(int type){
if (!isMiUIV6()){
return;
}
Window window = this.getWindow();
Class clazz = window.getClass();
try {
int tranceFlag = 0;
int darkModeFlag = 0;
Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_TRANSPARENT");
tranceFlag = field.getInt(layoutParams);
field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
if (type == 0){
extraFlagField.invoke(window, tranceFlag, tranceFlag);//只需要状态栏透明
}else if(type == 1){
extraFlagField.invoke(window, tranceFlag | darkModeFlag, tranceFlag | darkModeFlag);//状态栏透明且黑色字体
}else {
extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体
}
}catch (Exception e){
}
}
private boolean isMiUIV6() {
try {
final BuildProperties prop = BuildProperties.newInstance();
String name = prop.getProperty(KEY_MIUI_VERSION_NAME, "");
if ("V6".equals(name)){
return true;
}else {
return false;
}
} catch (final IOException e) {
return false;
}
}
}
相关文章:猛戳这里