Android实现个人资料页面头像背景模糊显示包(状态栏)

发布时间 - 2026-01-10 23:23:43    点击率:

最近要实现这样一个效果,然后拿出来与大家分享一下主要的几段代码,希望大家能够用到,与人方便自己方便嘛!

首先:

要实现的是浮动状态栏效果,通过在Activity的onCreate方法中调用这个方法,然后就可以让整个布局浮现在整个手机屏幕之下了,这是我觉着最简单的一种方法了。

public static void alphaTask(Activity context) {
  context.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = context.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
        | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.TRANSPARENT);
    window.setNavigationBarColor(Color.TRANSPARENT);
  }
}

接下来:

获得状态栏高度,将actionbar(我这里是自己在布局当中写的,然后在代码中设置他距离顶部的高度让他看起来和我们的bar没有什么区别)的位置改变位于状态来的下方

public static int getStatusBarHight(Context context) {
    /**
     * 获取状态栏高度——方法1
     * */
    int statusBarHeight = -1;
    //获取status_bar_height资源的ID
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
      //根据资源ID获取响应的尺寸值
      statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
    }
//    int i = DensityUtil.px2dip(context, statusBarHeight);

    return statusBarHeight;
  }

最后:

实现背景高斯模糊效果的

public class FastBlurUtils {
  public static Bitmap doBlur(Bitmap sentBitmap, int radius,
                boolean canReuseInBitmap) {
    Bitmap bitmap;
    if (canReuseInBitmap) {
      bitmap = sentBitmap;
    } else {
      bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
    }
    if (radius < 1) {
      return (null);
    }
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    int[] pix = new int[w * h];
    bitmap.getPixels(pix, 0, w, 0, 0, w, h);
    int wm = w - 1;
    int hm = h - 1;
    int wh = w * h;
    int div = radius + radius + 1;
    int r[] = new int[wh];
    int g[] = new int[wh];
    int b[] = new int[wh];
    int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
    int vmin[] = new int[Math.max(w, h)];
    int divsum = (div + 1) >> 1;
    divsum *= divsum;
    int dv[] = new int[256 * divsum];
    for (i = 0; i < 256 * divsum; i++) {
      dv[i] = (i / divsum);
    }
    yw = yi = 0;
    int[][] stack = new int[div][3];
    int stackpointer;
    int stackstart;
    int[] sir;
    int rbs;
    int r1 = radius + 1;
    int routsum, goutsum, boutsum;
    int rinsum, ginsum, binsum;
    for (y = 0; y < h; y++) {
      rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
      for (i = -radius; i <= radius; i++) {
        p = pix[yi + Math.min(wm, Math.max(i, 0))];
        sir = stack[i + radius];
        sir[0] = (p & 0xff0000) >> 16;
        sir[1] = (p & 0x00ff00) >> 8;
        sir[2] = (p & 0x0000ff);
        rbs = r1 - Math.abs(i);
        rsum += sir[0] * rbs;
        gsum += sir[1] * rbs;
        bsum += sir[2] * rbs;
        if (i > 0) {
          rinsum += sir[0];
          ginsum += sir[1];
          binsum += sir[2];
        } else {
          routsum += sir[0];
          goutsum += sir[1];
          boutsum += sir[2];
        }
      }
      stackpointer = radius;
      for (x = 0; x < w; x++) {
        r[yi] = dv[rsum];
        g[yi] = dv[gsum];
        b[yi] = dv[bsum];
        rsum -= routsum;
        gsum -= goutsum;
        bsum -= boutsum;
        stackstart = stackpointer - radius + div;
        sir = stack[stackstart % div];
        routsum -= sir[0];
        goutsum -= sir[1];
        boutsum -= sir[2];
        if (y == 0) {
          vmin[x] = Math.min(x + radius + 1, wm);
        }
        p = pix[yw + vmin[x]];
        sir[0] = (p & 0xff0000) >> 16;
        sir[1] = (p & 0x00ff00) >> 8;
        sir[2] = (p & 0x0000ff);
        rinsum += sir[0];
        ginsum += sir[1];
        binsum += sir[2];
        rsum += rinsum;
        gsum += ginsum;
        bsum += binsum;
        stackpointer = (stackpointer + 1) % div;
        sir = stack[(stackpointer) % div];
        routsum += sir[0];
        goutsum += sir[1];
        boutsum += sir[2];
        rinsum -= sir[0];
        ginsum -= sir[1];
        binsum -= sir[2];
        yi++;
      }
      yw += w;
    }
    for (x = 0; x < w; x++) {
      rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
      yp = -radius * w;
      for (i = -radius; i <= radius; i++) {
        yi = Math.max(0, yp) + x;
        sir = stack[i + radius];
        sir[0] = r[yi];
        sir[1] = g[yi];
        sir[2] = b[yi];
        rbs = r1 - Math.abs(i);
        rsum += r[yi] * rbs;
        gsum += g[yi] * rbs;
        bsum += b[yi] * rbs;
        if (i > 0) {
          rinsum += sir[0];
          ginsum += sir[1];
          binsum += sir[2];
        } else {
          routsum += sir[0];
          goutsum += sir[1];
          boutsum += sir[2];
        }
        if (i < hm) {
          yp += w;
        }
      }
      yi = x;
      stackpointer = radius;
      for (y = 0; y < h; y++) {
        // Preserve alpha channel: ( 0xff000000 & pix[yi] )
        pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
            | (dv[gsum] << 8) | dv[bsum];
        rsum -= routsum;
        gsum -= goutsum;
        bsum -= boutsum;
        stackstart = stackpointer - radius + div;
        sir = stack[stackstart % div];
        routsum -= sir[0];
        goutsum -= sir[1];
        boutsum -= sir[2];
        if (x == 0) {
          vmin[y] = Math.min(y + r1, hm) * w;
        }
        p = x + vmin[y];
        sir[0] = r[p];
        sir[1] = g[p];
        sir[2] = b[p];
        rinsum += sir[0];
        ginsum += sir[1];
        binsum += sir[2];
        rsum += rinsum;
        gsum += ginsum;
        bsum += binsum;
        stackpointer = (stackpointer + 1) % div;
        sir = stack[stackpointer];
        routsum += sir[0];
        goutsum += sir[1];
        boutsum += sir[2];
        rinsum -= sir[0];
        ginsum -= sir[1];
        binsum -= sir[2];
        yi += w;
      }
    }
    bitmap.setPixels(pix, 0, w, 0, 0, w, h);
    return (bitmap);
  }
}

这里再加一个上圆形头像的工具,将图片转换为圆形,很方便的

/**
 * 转换图片成圆形
 * @param bitmap 传入Bitmap对象
 * @return
 */
public static Bitmap toRoundBitmap(Bitmap bitmap) {
  int width = bitmap.getWidth();
  int height = bitmap.getHeight();
  float roundPx;
  float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
  if (width <= height) {
    roundPx = width / 2;
    top = 0;
    bottom = width;
    left = 0;
    right = width;
    height = width;
    dst_left = 0;
    dst_top = 0;
    dst_right = width;
    dst_bottom = width;
  } else {
    roundPx = height / 2;
    float clip = (width - height) / 2;
    left = clip;
    right = width - clip;
    top = 0;
    bottom = height;
    width = height;
    dst_left = 0;
    dst_top = 0;
    dst_right = height;
    dst_bottom = height;
  }
  Bitmap output = Bitmap.createBitmap(width,
      height, Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(output);
  final int color = 0xff424242;
  final Paint paint = new Paint();
  final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom);
  final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom);
  final RectF rectF = new RectF(dst);
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(color);
  canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  canvas.drawBitmap(bitmap, src, dst, paint);
  return output;
}

以上所述是小编给大家介绍的 Android实现个人资料页面头像背景模糊显示包括状态栏,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android 页面背景模糊  # android 状态栏高斯模糊  # android 仿QQ动态背景、视频背景的示例代码  # android换肤功能 如何动态获取控件中背景图片的资源id?  # Android实现动态切换组件背景的方法  # Android编程中聊天页面背景图片、标题栏由于键盘引起问题的解决方法  # Android studio实现动态背景页面  # 状态栏  # 小编  # 的是  # 让他  # 在此  # 下了  # 这是我  # 给大家  # 这样一个  # 希望大家  # 拿出来  # 大家分享  # 最简单  # 再加  # 转换为  # 很方便  # 所述  # 给我留言  # 感谢大家  # 就可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何挑选优质建站一级代理提升网站排名?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在局域网内绑定自建网站域名?  如何在腾讯云免费申请建站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在建站之星绑定自定义域名?  Python文本处理实践_日志清洗解析【指导】  C++用Dijkstra(迪杰斯特拉)算法求最短路径  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何在香港服务器上快速搭建免备案网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  如何快速完成中国万网建站详细流程?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  高端云建站费用究竟需要多少预算?  微信小程序 闭包写法详细介绍  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  *服务器网站为何频现安全漏洞?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何快速查询网址的建站时间与历史轨迹?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  高性能网站服务器配置指南:安全稳定与高效建站核心方案  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  焦点电影公司作品,电影焦点结局是什么?  如何在建站主机中优化服务器配置?  用v-html解决Vue.js渲染中html标签不被解析的问题  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  使用Dockerfile构建java web环境  如何在云服务器上快速搭建个人网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Windows Hello人脸识别突然无法使用  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  C++时间戳转换成日期时间的步骤和示例代码  jquery插件bootstrapValidator表单验证详解  中山网站推广排名,中山信息港登录入口?  如何在宝塔面板中创建新站点?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  个人摄影网站制作流程,摄影爱好者都去什么网站?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)