状态栏颜色设置

废话省去,先来段热身代码:

 //用于获取非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;
        }
    }
}

相关文章:猛戳这里

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值