背景

毛玻璃,开发中又爱又恨的一个话题,玩法层出不穷,有动态的,也有静态的。有的是实时模糊,有些只需要模糊一次,本文的毛玻璃实现,就是静态毛玻璃。

开发环境

win 10
as 4+
jdk 1.8

代码

!!!源码在文末!!!

最终效果

思路

看到上图,首先就要观察有什么要点:
(1)毛玻璃的区域,是与图片“内容连贯”的,就是说,毛玻璃展示内容,和实际内容一致,视觉上就是“局部毛玻璃”的效果。
(2)毛玻璃的形状,看上去,毛玻璃四个角都是圆角,所以,就涉及到毛玻璃展示过程中的圆角绘制。

根据要点,可以总结出,原图,必须要先加载出来,然后设置到ImageView上面,再获取ImageView正在显示的图像(先设置到ImageView,因为会收到其ScaleType属性影响),然后自定义view对获取的图片进行处理即可。

实现

原理说完了,那又要怎么实现呢?列出步骤:
(一)把图片显示在背景控件上面
(二)把背景控件显示后的图片,传入到自定义毛玻璃控件中
(三)通过canvas处理,绘制,显示
下面开始具体描述如何实现:

(一)把图片显示在背景控件上面

这一步就是常规操作了,可以用glide,也可以本地随便搞一个图片设置到背景控件中即可,笔者这里的demo是通过ImageView xml属性配置的。

(二)把背景控件显示后的图片,传入到自定义毛玻璃控件中

这里就涉及到一个“获取显示控件的图片”这一个逻辑,具体的实现代码如下:

/*** 普通截图*/public static void viewSnapShot(View view, ViewSnapListener listener) {try {//使控件可以进行缓存view.setDrawingCacheEnabled(true);//获取缓存的 BitmapBitmap drawingCache = view.getDrawingCache();//复制获取的 BitmapdrawingCache = Bitmap.createBitmap(drawingCache, 0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());//关闭视图的缓存view.setDrawingCacheEnabled(false);view.destroyDrawingCache();if (drawingCache != null) {if (listener != null) {listener.success(drawingCache);}} else {if (listener != null) {listener.failed("draw cache is null");}}} catch (Exception e) {if (listener != null) {listener.failed(e.getMessage());}}}

通过该方法,可以获取ImageView控件显示中的图片,并且返回一个bitmap对象给外部了。

(三)通过canvas处理,绘制,显示

这里涉及到自定义view。首先,先看xml设置的布局位置,代码如下:

        <RelativeLayoutandroid:layout_width="match_parent"android:layout_height="200dp"><ImageViewandroid:id="@+id/thirdImg"android:layout_width="match_parent"android:layout_height="200dp"android:scaleType="centerCrop"android:src="@drawable/testblur" /><com.example.ktdemo.blur.blurwidget.BlurAlignBottomViewandroid:id="@+id/ivBlurView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentBottom="true" /></RelativeLayout>

可以看到,自定义毛玻璃控件BlurAlignBottomView的宽高是与背景图片显示控件的宽高一样的。

再说核心实现。因为宽高一样,所以处理起来,就简单很多了。
(1)通过clipRect方法,剪裁不需要显示的区域
(2)最后把bitmap高斯模糊后通过canvas画上去

对bitmap进行高斯模糊的代码如下:

    public static Bitmap blur(Context context,int blurRadius, Bitmap srcBitmap) {try {float radius = Math.min(25,blurRadius);radius = Math.max(0,radius);Bitmap bitmap = srcBitmap.copy(srcBitmap.getConfig(), true);final RenderScript rs = RenderScript.create(context);final Allocation input = Allocation.createFromBitmap(rs, srcBitmap,Allocation.MipmapControl.MIPMAP_NONE,Allocation.USAGE_SCRIPT);final Allocation output = Allocation.createTyped(rs, input.getType());final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));script.setRadius(radius /* e.g. 3.f */);script.setInput(input);script.forEach(output);output.copyTo(bitmap);return bitmap;} catch (Exception e) {e.printStackTrace();return srcBitmap;}}

使用原生RenderScript模糊即可。

剪裁显示范围以及绘制bitmap核心代码如下:

            int mesWidth = getMeasuredWidth();int mesHeight = getMeasuredHeight();float radius = mBlurInfo.getRadius();Bitmap mSrcBitmap = mBlurInfo.getSrcBitmap();canvas.save();canvas.clipRect(0, mesHeight - mBlurInfo.getBlurHeight(), mesWidth, mesHeight);RectF canvasRectF = new RectF(0, mesHeight - mBlurInfo.getBlurHeight(), mesWidth, mesHeight);Path mPath = new Path();mPath.addRoundRect(canvasRectF, radius, radius, Path.Direction.CW);canvas.clipPath(mPath);Rect bitmapRect = new Rect(0, 0, mesWidth, mesHeight);canvas.drawBitmap(mSrcBitmap, null, bitmapRect, null);canvas.restore();}

总结。实现方式其实用很多,而文中的实现方式,仅仅是众多方法中的一种而已,各位若有更好的方法请在评论区留言。

代码地址
搜索BlurAlignBottomView类

that’s all----------------------------------------------------------------------------

关于安卓毛玻璃实现(三)recyclerview静态毛玻璃相关推荐

  1. 安卓开发之用RecyclerView做陈列式布局(仿小红书首页/淘宝商品浏览)

    安卓开发之用RecyclerView做陈列式布局 一.使用RecyclerView要先导入recyclerview-v7库 二.在layout文件夹内,新建一个xml文件,编写你要展示的item的样式 ...

  2. 广东东软学院安卓实验报告三:“数据存储”

    广东东软学院安卓实验报告三:"数据存储" Android schoolwork entertainment app: imitating wechat Software tips: ...

  3. 精品手游小精灵大作战源码 安卓+IOS+H5三端Cocos Creator 客户端 JAVA服务端

    小精灵大作战 数据库说明 数据库使用MySQL,推荐管理软件Navicat For MySQL. 创建数据库命名为pet_battle,字符集选用utf8 -- UTF-8 Unicode,排序规则选 ...

  4. 疯狂安卓讲义第三版安卓源码(最新版的)

    其实写这个主要是因为上传的源码比较大,但是又想给大家提供最新的疯狂安卓讲义第三版的安卓源代码,以便于大家对安卓更好的学习. 第三版与前两版的不同之处包括:编译器全部用了android studio来进 ...

  5. Android 图片模糊、高斯模糊、毛玻璃的三种实现方法

    在前几天写过一个使用glide-transformations的方法实现高斯模糊的方法,今天偶然间有发现一个大神写的另一个方法,感觉挺不错的,分享一下: 效果图: 原文链接:点击访问 这使用也很简单, ...

  6. [安卓开发] Broadcast 三种广播的使用总结

    1.什么是安卓的Broadcast? 安卓的四大组件之一,是一种广泛应用在应用程序之间传输信息的机制. 2.什么是安卓的BroadcastReceiver? 是对发送出来的广播进行过滤接收并响应的一类 ...

  7. 安卓9.0设置WIFI静态IP地址。

    简单的一个函数实现对wifi设置静态或动态IP地址. 一.需要的权限 <uses-permission android:name="android.permission.ACCESS_ ...

  8. css毛玻璃效果白边_CSS3毛玻璃效果(blur)有白边问题的解决方法

    做一个登录页,全屏背景图毛玻璃效果,实现方法如下: HTML: var w = window.innerWidth || document.documentElement.clientWidth || ...

  9. Stream流与Lambda表达式(三) 静态工厂类Collectors

    /*** @author 陈杨*/@SpringBootTest @RunWith(SpringRunner.class) public class CollectorsDetail {private ...

最新文章

  1. 记录Datagrid使用的一些事项
  2. 从视觉检测窥探人类大脑和数字大脑的差别
  3. 递归1:二叉搜索树的范围和
  4. 下拉推广系统立择火星推荐_下拉词优化不仅仅优化百度,其实还可以优化抖音、京东和阿里巴巴...
  5. boost::enable_shared_from_this相关的测试程序
  6. QT-Creator+SDK+编译器+自定义配置
  7. another mysql daemon,[守护进程详解及创建,daemon()使用
  8. 计算机视觉实战(十二)全景图像拼接(附完整代码)
  9. Atitit.程序包装exe启动器 打包 发布 设计 -生成exe java
  10. 特征选择算法之 ReliefF 算法
  11. 基于体素的全局光照技术
  12. 什么是CTI?呼叫中心系统CTI技术的应用
  13. 【THUSC 2018】菜鸡互啄记
  14. 接入微信小程序统一服务消息
  15. Shopee店铺爆单赚钱核心方法!跨境商家必学技能(干货建议收藏)
  16. excel 科学计数法导入数据库
  17. lisp 车位块自动编号_CAD如何生成自动编号
  18. 二十六万字详解bat文件
  19. 常用外贸群发邮件模板,海外邮件
  20. 小型数控雕刻机制作Arduino_基于Arduino DIY的激光雕刻机

热门文章

  1. javascript cookies操作
  2. C++ 鼠标点击的获取
  3. Mockito mockStatic, mockConstruction
  4. linux 远程文件拷贝
  5. 爱启航2020考研数学真题大串讲讲义
  6. 前端常用几种设计模式
  7. pythonocc_pythonOCC例子搬运:4.经典瓶子造型
  8. 曾经狠幸福空间QQ日志-喜欢伤感,甚至颓废
  9. kmplayer加速播放视频(转)
  10. *.sh和*.bin文件安装 vs fedora下安装永中office