美文网首页
沉浸式状态栏工具

沉浸式状态栏工具

作者: 无敌肥球王 | 来源:发表于2019-03-24 22:13 被阅读0次
/**
 * Created by ricky.peng on 2018/5/25.
 * @author ricky.peng
 * 沉浸式状态栏工具类
 */
public class TStatusBarHelper {
    //是否需要沉浸式状态栏
    private static boolean isNeedTransStatus=true;
    //沉浸式状态栏,比较复杂的沉浸式建议用这个
    // 4.4上没有状态栏着色,如果状态栏变浅色容易导致看不清状态栏字体,
    // 5.0有着色的时候,避免浅色状态栏看不清字体设置半透明状态栏
    // 6.0 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR可以让系统自适应状态栏字体和背景色
    public static void translucentStatus(Activity activity) {
        if (activity == null||!isNeedTransStatus) {
            return;
        }
        Window window = activity.getWindow();
        if (window != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //取消状态栏透明
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //添加Flag把状态栏设为可绘制模式
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //设置状态栏颜色,API 21开始可以使用,低于6.0的时候,很多页面都是浅色的,导致状态栏不清晰,所以5.0设置半透明
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    window.setStatusBarColor(Color.TRANSPARENT);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    window.setStatusBarColor(Color.parseColor("#33000000"));
                }
                //设置系统状态栏处于可见状态
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        }
    }
    //沉浸式状态栏,如果UI设计比较简单,建议使用这个
    public static void translucentEasyStatus(Activity activity) {
        if (activity == null||!isNeedTransStatus) {
            return;
        }
        Window window = activity.getWindow();
        if (window != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //取消状态栏透明
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //添加Flag把状态栏设为可绘制模式
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //设置状态栏颜色,API 21开始可以使用,低于6.0的时候,很多页面都是浅色的,导致状态栏不清晰,所以5.0设置半透明
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    window.setStatusBarColor(Color.TRANSPARENT);
                }
                //设置系统状态栏处于可见状态
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        }
    }
    //沉浸式状态栏,微信的做法,通过UI设计同意toolbar和状态栏颜色,减少适配的问题
    public static void translucentStatus(Activity activity,int color) {
        if (activity == null||!isNeedTransStatus) {
            return;
        }
        Window window = activity.getWindow();
        if (window != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //取消状态栏透明
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //添加Flag把状态栏设为可绘制模式
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //设置状态栏颜色
                window.setStatusBarColor(ContextCompat.getColor(activity, color));
                //设置系统状态栏处于可见状态
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                }
            }
        }
    }
    //fragment的沉浸式适配,要让fragment的背景延伸到状态栏
    // 不使用activity的背景色的时候,fitSystemWindows=false,然后再fragment中设置这个,否则直接设置fitSystemWindows=true会采用activity的背景色
    public static void setStatusBarHeight(View view){
        if (view!=null&&isNeedTransStatus) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                view.setPadding(0, getstatubarheight(view.getContext()), 0, 0);
            }
        }
    }
    //获取状态栏高度
    private static int getstatubarheight(Context context) {
        int height = 0;
        int resourceid = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceid > 0) {
            height = context.getResources().getDimensionPixelOffset(resourceid);
        }
        return height;
    }
}

想要做到包括图片在内的沉浸, 必须理解好fitsSystemWindows属性, 以利用padding效果, 将内容上移或者下移
当然,还有xml的方法可以设置,百度谷歌都有很多,还有设置沉浸以后在顶部设置一个透明view的方法。
大家具体可以根据项目需求,选择最简单的实现。

相关文章

网友评论

      本文标题:沉浸式状态栏工具

      本文链接:https://www.haomeiwen.com/subject/sqwpvqtx.html