安卓透明状态栏的实现

来源:互联网 发布:mac连接ipad一闪一闪 编辑:程序博客网 时间:2024/06/14 05:55

一般情况下我们的app,都会有banner图,而banner图配合透明状态栏会让人感觉更美观,废话不多说先上图

这里写图片描述

思路

其实要实现透明状态栏只需要给window 设置Flags属性,让应用的主体内容占用系统状态栏的空间,最后再调用Window的setStatusBarColor()方法将状态栏设置成透明色就可以了,而setStatusBarColor()只有版本大于等于5.0才可以调用,适配的时候而有的5.0手机也有不支持此方法的,所以当低于6.0时,我们创建一个和状态栏大小相等的view,覆盖在状态栏的位置,然后给这个view设置颜色和透明度。
值得注意的是,设置Flags属性只适用于4.4以上版本,有一部分4.4手机也不支持此方法,所以适配5.0及以上即可。下边上代码:

public class LzhStatusBarUtils {    public static final int IS_SET_PADDING_KEY = 123456789;    private static final int TRANSLUCENT_VIEW_ID = R.id.translucent_view;    //    /**     * 设置ImageView为第一控件的可以调整透明度的状态栏     *     * @param activity     */    public static void setTranslucentStatusBar(Activity activity, View topView, int alpha) {        setARGBStatusBar(activity, topView, 0, 0, 0, alpha);    }    //    /**     * 设置透明状态栏版本的状态栏的ARGB     * @param activity     * @param topView     * @param r     * @param g     * @param b     * @param alpha     */    public static void setARGBStatusBar(Activity activity, View topView, int r, int g, int b, int alpha) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {            return;        }        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            activity.getWindow().setStatusBarColor(Color.argb(alpha, r, g, b));        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){            activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            //activity.getWindow().setStatusBarColor(Color.argb(alpha, r, g, b));            setARGBStatusViewToAct(activity, r, g, b, alpha);        }        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            setARGBStatusViewToAct(activity, r, g, b, alpha);        }        if (topView != null) {            boolean isSetPadding = topView.getTag(IS_SET_PADDING_KEY) != null;            if (!isSetPadding) {                topView.setPadding(topView.getPaddingLeft(), topView.getPaddingTop() + getStatusBarHeight(activity), topView.getPaddingRight(), topView.getPaddingBottom());                topView.setTag(IS_SET_PADDING_KEY, true);            }        }    }    //    /**     * 在有fragment的activity中使用     * 注:需要在有状态栏的fragment的最顶端加一个状态栏大小的view     *     * @param activity     * @param alpha     */    public static void setTranslucentForImageViewInFragment(Activity activity, int alpha) {        setTranslucentStatusBar(activity, null, alpha);    }    //    /**     * 设置状态栏view的ARGB,如果找到状态栏view则直接设置,否则创建一个再设置     *     * @param activity     * @param statusBarAlpha     */    private static void setARGBStatusViewToAct(Activity activity, int r, int g, int b, int statusBarAlpha) {        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);        View fakeStatusBarView = contentView.findViewById(TRANSLUCENT_VIEW_ID);        if (fakeStatusBarView != null) {            if (fakeStatusBarView.getVisibility() == View.GONE) {                fakeStatusBarView.setVisibility(View.VISIBLE);            }            fakeStatusBarView.setBackgroundColor(Color.argb(statusBarAlpha, r, g, b));        } else {            contentView.addView(createARGBStatusBarView(activity, r, g, b, statusBarAlpha));        }    }    //    /**     * 创建和状态栏一样高的矩形,用于改变状态栏ARGB     *     * @param activity     * @param r     * @param g     * @param b     * @param alpha     * @return     */    private static View createARGBStatusBarView(Activity activity, int r, int g, int b, int alpha) {        // 绘制一个和状态栏一样高的矩形        View statusBarView = new View(activity);        LinearLayout.LayoutParams params =                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));        statusBarView.setLayoutParams(params);        statusBarView.setBackgroundColor(Color.argb(alpha, r, g, b));        statusBarView.setId(TRANSLUCENT_VIEW_ID);        return statusBarView;    }    //    /**     * 得到statusbar高度     *     * @param activity     * @return     */    private static int getStatusBarHeight(Activity activity) {        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");        return activity.getResources().getDimensionPixelSize(resourceId);    }}

调用的话只需要 LzhStatusBarUtils.setTranslucentStatusBar(this,null,10);就可以了。

知识补充: gif图上的导航栏渐变效果
因为运用的RecyclerView,而RecyclerView有一个滑动监听方法,不啰嗦上代码.

   rc.addOnScrollListener(new RecyclerView.OnScrollListener() {            private int totalDy = 0;            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);                totalDy += dy;                if (totalDy <= bannerHeight) {                    float alpha = (float) totalDy / bannerHeight;                  toolbar.setAlpha(alpha);                } else {                    toolbar.setAlpha(1.0f);                }            }        });

在这个方法进行滑动监听,根据距离设置透明度。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq登不了微信怎么办 qq不能登录微信怎么办 qq号一年没用了怎么办 微信里别人可以看到我手机号怎么办 用手机号注册的微信换号后怎么办 微信群推送名片很多人加怎么办 志高制冷显示ff怎么办 百度账号手机号换了怎么办 别人盗取手机号的通讯录该怎么办 58简历看不到真实号码怎么办 淘宝更换手机号码说已注册怎么办 系统把qq冻结了怎么办 qq被永久冻结好友怎么办 群发不小心发错怎么办 qq群成员满了怎么办 qq知道密码没手机号验证怎么办 改房本上的名字怎么办 支付宝租给别人怎么办 微信麻将房间卡怎么办 皮肤挤伤了发黑怎么办 指甲被挤了黑了怎么办 手指被挤了变黑怎么办 榆次买房太原户口怎么办 皮肤又红又黑怎么办 打仙桃晃晃老输怎么办 微信支付忘了摇怎么办 苹果手机微信摇一摇摇不了怎么办 打麻将牌背的时候怎么办 打麻将背的时候怎么办 同城游台球初使化失败怎么办 qq密码改忘了怎么办啊 qq头像显示不出来怎么办 qq的重要数据被清理怎么办 把qq数据删除了怎么办 手机qq头像显示不同怎么办 手机qq图片显示不出来怎么办 微信群聊右上角双人头像没了怎么办 支付宝好友没了怎么办 手机qq好友头像没了怎么办 微信语音变成听筒模式怎么办 微信语音为听筒模式怎么办