2024阿里P7大牛教你自己写Android第三方库!

1,新建我们自己的Library

2,编写库库代码

这里比较简单,就是实现一个简单的沉侵式状态栏。沉侵式状态栏默认支持到4.4版本(5.0以后是系统默认支持的,对于5.0之前的是通过绘制一个和状态栏大小相等的矩形)。

public static void setColor(Activity activity, int color, int statusBarAlpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// 生成一个状态栏大小的矩形
View statusView = createStatusBarView(activity, color, statusBarAlpha);
// 添加 statusView 到布局中
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView);
setRootView(activity);
}
}

对于5.0及以上版本,我们直接调用Winows的setStatusBarColor()即可。

activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));

这里有一个方法是技术状态栏的颜色。返回int

private static int calculateStatusColor(int color, int alpha) {
float a = 1 - alpha / 255f;
int red = color >> 16 & 0xff;
int green = color >> 8 & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return 0xff << 24 | red << 16 | green << 8 | blue;
}

而对于5.0以下的版本,是通过绘制一个和状态栏一样的矩形。然后将这个view添加到Window容器中

private static View createStatusBarView(Activity activity, int color, int alpha) {
View statusBarView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
return statusBarView;
}

这里有一个核心的方法:

private static void setRootView(Activity activity) {
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
}

3,.1设置透明度

public static void setTranslucent(Activity activity, int statusBarAlpha) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
setTransparent(activity);
addTranslucentView(activity, statusBarAlpha);
}

同上这里也是分5.0以上和以下的

private static void transparentStatusBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}

最后贴上全部代码:

public class TintBarUtil {

//alpha(0-255)
public static final int DEFAULT_STATUS_BAR_ALPHA = 112;

/**

  • 设置状态栏颜色
    */
    public static void setColor(Activity activity, int color) {
    setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);
    }

/**

  • 设置状态栏颜色
    */
    public static void setColor(Activity activity, int color, int statusBarAlpha) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // 生成一个状态栏大小的矩形
    View statusView = createStatusBarView(activity, color, statusBarAlpha);
    // 添加 statusView 到布局中
    ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
    decorView.addView(statusView);
    setRootView(activity);
    }
    }

/**

  • 设置状态栏纯色 不加半透明效果
    */
    public static void setColorNoTranslucent(Activity activity, int color) {
    setColor(activity, color, 0);
    }

/**

  • 设置状态栏颜色(5.0以下无半透明效果,不建议使用)
    /
    public static void setColorHalf(Activity activity, int color) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // 生成一个状态栏大小的矩形
    View statusView = createStatusBarView(activity, color);
    // 添加 statusView 到布局中
    ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
    decorView.addView(statusView);
    setRootView(activity);
    }
    /
    *
  • 使状态栏半透明
  • 适用于图片作为背景的界面,此时需要图片填充到状态栏
    /
    public static void setTranslucent(Activity activity) {
    setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
    }
    /
    *
  • 使状态栏半透明
  • 适用于图片作为背景的界面,此时需要图片填充到状态栏
    /
    public static void setTranslucent(Activity activity, int statusBarAlpha) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    setTransparent(activity);
    addTranslucentView(activity, statusBarAlpha);
    }
    /
    *
  • 设置状态栏全透明
    /
    public static void setTransparent(Activity activity) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    transparentStatusBar(activity);
    setRootView(activity);
    }
    /
    *
  • 使状态栏透明(5.0以上半透明效果,不建议使用)
    */
    public static void setTranslucentHalf(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    setRootView(activity);
    }
    }

/**

  • 为DrawerLayout 布局设置状态栏变色
    */
    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
    setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);
    }

/**

  • 为DrawerLayout 布局设置状态栏颜色,纯色
    */
    public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color) {
    setColorForDrawerLayout(activity, drawerLayout, color, 0);
    }

/**

  • 为DrawerLayout 布局设置状态栏变色
    */
    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int color, int statusBarAlpha) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    } else {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
    View statusBarView = createStatusBarView(activity, color);
    ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
    contentLayout.addView(statusBarView, 0);
    // 内容布局不是 LinearLayout 时,设置padding top
    if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
    contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
    }
    // 设置属性
    ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
    drawerLayout.setFitsSystemWindows(false);
    contentLayout.setFitsSystemWindows(false);
    contentLayout.setClipToPadding(true);
    drawer.setFitsSystemWindows(false);

addTranslucentView(activity, statusBarAlpha);
}

/**

  • 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)
    */
    public static void setColorForDrawerLayoutHalf(Activity activity, DrawerLayout drawerLayout, int color) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    View statusBarView = createStatusBarView(activity, color);
    ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
    contentLayout.addView(statusBarView, 0);
    // 内容布局不是 LinearLayout 时,设置padding top
    if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
    contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
    }
    // 设置属性
    ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
    drawerLayout.setFitsSystemWindows(false);
    contentLayout.setFitsSystemWindows(false);
    contentLayout.setClipToPadding(true);
    drawer.setFitsSystemWindows(false);
    }
    }

/**

  • 为 DrawerLayout 布局设置状态栏透明
    */
    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
    setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);
    }

/**

  • 为 DrawerLayout 布局设置状态栏透明
    /
    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    setTransparentForDrawerLayout(activity, drawerLayout);
    addTranslucentView(activity, statusBarAlpha);
    }
    /
    *
  • 为 DrawerLayout 布局设置状态栏透明
    */
    public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    return;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    } else {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
// 内容布局不是 LinearLayout 时,设置padding top
if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
}

// 设置属性
ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
drawerLayout.setFitsSystemWindows(false);
contentLayout.setFitsSystemWindows(false);
contentLayout.setClipToPadding(true);
drawer.setFitsSystemWindows(false);
}

/**

  • 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)
    */
    public static void setTranslucentForDrawerLayoutHalf(Activity activity, DrawerLayout drawerLayout) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
    contentLayout.setFitsSystemWindows(true);
    contentLayout.setClipToPadding(true);
    ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);
    vg.setFitsSystemWindows(false);
    drawerLayout.setFitsSystemWindows(false);
    }
    }

/**

  • 添加半透明矩形条
    */
    private static void addTranslucentView(Activity activity, int statusBarAlpha) {
    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    if (contentView.getChildCount() > 1) {
    contentView.removeViewAt(1);
    }
    contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));
    }

/**

  • 生成一个和状态栏大小相同的彩色矩形条
    */
    private static View createStatusBarView(Activity activity, int color) {
    View statusBarView = new View(activity);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    getStatusBarHeight(activity));
    statusBarView.setLayoutParams(params);
    statusBarView.setBackgroundColor(color);
    return statusBarView;
    }

/**

  • 生成一个和状态栏大小相同的半透明矩形条
    */
    private static View createStatusBarView(Activity activity, int color, int alpha) {
    View statusBarView = new View(activity);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    getStatusBarHeight(activity));
    statusBarView.setLayoutParams(params);
    statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
    return statusBarView;
    }

/**

  • 设置根布局参数
    */
    private static void setRootView(Activity activity) {
    ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
    rootView.setFitsSystemWindows(true);
    rootView.setClipToPadding(true);
    }

/**

  • 使状态栏透明
    */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    private static void transparentStatusBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
    } else {
    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
    }

/**

  • 创建半透明矩形 View
    */
    private static View createTranslucentStatusBarView(Activity activity, 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, 0, 0, 0));
    return statusBarView;
    }

/**

  • 获取状态栏高度
    */
    private static int getStatusBarHeight(Context context) {
    int resourceId = context.getResources().getIdentifier(“status_bar_height”, “dimen”, “android”);
    return context.getResources().getDimensionPixelSize(resourceId);
    }

/**

  • 计算状态栏颜色
    */
    private static int calculateStatusColor(int color, int alpha) {
    float a = 1 - alpha / 255f;
    int red = color >> 16 & 0xff;
    int green = color >> 8 & 0xff;

*/
private static int getStatusBarHeight(Context context) {
int resourceId = context.getResources().getIdentifier(“status_bar_height”, “dimen”, “android”);
return context.getResources().getDimensionPixelSize(resourceId);
}

/**

  • 计算状态栏颜色
    */
    private static int calculateStatusColor(int color, int alpha) {
    float a = 1 - alpha / 255f;
    int red = color >> 16 & 0xff;
    int green = color >> 8 & 0xff;
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值