Hopefully we’re growing all the time ~

Look here ~

  • blurkit三方框架
    • 前期提要
    • 使用方式
    • 完整代码
  • blurry三方框架
    • 使用方式
    • 实际使用

blurkit三方框架

记得去年做项目的时候,有涉及到毛玻璃遮罩层的功能,但是因为项目时间太紧,所以放弃了毛玻璃的效果,索性最近有时间就学习记录一波 ~ 文中细节并没有去处理,只是用最简单的方式,实现了我的需求 ~

半成品 - Demo 效果
注 :个人感觉,更适合整体遮罩层

前期提要

要实现效果可直接跳到使用方式开始看!

关于更具体的详情,请查看文末的借鉴文章之处 > <~

  • 模糊方案

1.Java实现,一般都是采用Stack模糊算法 (亲测:频繁invalidate(),模糊效果消失)
2.RenderScript实现 (亲测:频繁invalidate(),模糊效果消失)
3.Native实现 (未尝试)
4.OpenCV或者OpenGL实现(未尝试)

  • BlurLayout自定义属性

注:只用到了blurkit:blk_fps属性,其他属性一用就报错,崩溃的那种,具体问题没有去排查,因为懒 ~

看别人的博客也存在这样的问题,原话是这样的:在blurkit-android的目前的代码中(包括最新版本),BlurLayout的blk_alpha属性并不能使用。因为在代码中存在类型转换错误。英语好的同学可以去提issue

当然他说的是blk_alpha属性 - - 有机会我在重新尝试

    //每过1000/fps的时间重新绘制一次BlurLayout,blurkit:blk_fps="60"//透明度blurkit:blk_alpha="0.5"//模糊半径blurkit:blk_blurRadius="15"//BlurLayout的圆角半径blurkit:blk_cornerRadius="30dp"//缩放大小,是先放大再缩小,所以值太大则有可能OOMblurkit:blk_downscaleFactor="0.12"
  • 直接对View及Bitmap进行高斯模糊的使用(测量TextView会崩溃,提示宽高测不到,为0)
  //进行BlurKit初始化,在Application中初始化BlurKit.init(this);//通过RenderScript进行高斯模糊并返回一个bitmap,iv1可以是一个View,也可以是一个ViewGroup,25是模糊半径Bitmap bt=BlurKit.getInstance().blur(iv1, 25);//通过RenderScript进行高斯模糊并返回一个bitmap,传入的是一个bitmap,25是模糊半径Bitmap bt=BlurKit.getInstance().blur(bitmap, 25);//通过RenderScript进行高斯模糊并返回一个bitmap,iv1可以是一个View,也可以是一个ViewGroup,25是模糊半径,2代表缩放比例,如果值太大可能会出现OOMBitmap bt=BlurKit.getInstance().fastBlur(iv1,25,2)
  • blurkit-android的毛玻璃实现原理(Me no look)
  //在类BlurKit中public Bitmap blur(Bitmap src, int radius) {final Allocation input = Allocation.createFromBitmap(rs, src);final Allocation output = Allocation.createTyped(rs, input.getType());final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));script.setRadius(radius);script.setInput(input);script.forEach(output);output.copyTo(src);return src;}

使用方式

  • bulid.app

注 :要使用blurkit-android的1.1.1版本(目前最新版本),不要使用1.1.0版本(虽然GitHub上的使用文档还是1.1.0)
因为使用1.1.1版本时minSdkVersion的值可以是17,而使用1.1.0版本时minSdkVersion的值必须是21

  implementation 'io.alterac.blurkit:blurkit:1.1.1'
  • xml
    <io.alterac.blurkit.BlurLayoutandroid:id="@+id/blurLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"blurkit:blk_fps="0"/>
  • Activity、Fragment等使用处
  @Overrideprotected void onStart() {super.onStart();blurLayout.startBlur();blurLayout.lockView();}@Overrideprotected void onStop() {super.onStop();blurLayout.pauseBlur();}

完整代码

  • MainActivity
package nkwl.com.glassdemo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import io.alterac.blurkit.BlurLayout;public class MainActivity extends AppCompatActivity {private BlurLayout blurLayout;private TextView mStart;private TextView mStop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mStart = findViewById(R.id.tv_start);mStop = findViewById(R.id.tv_stop);blurLayout = findViewById(R.id.blurLayout);mStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "开始模糊", Toast.LENGTH_LONG).show();blurLayout.setVisibility(View.VISIBLE);}});mStop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "停止模糊", Toast.LENGTH_LONG).show();blurLayout.setVisibility(View.GONE);}});}@Overrideprotected void onStart() {super.onStart();blurLayout.startBlur();blurLayout.lockView();}@Overrideprotected void onStop() {super.onStop();blurLayout.pauseBlur();}
}
  • activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:blurkit="http://schemas.android.com/apk/res-auto"android:id="@+id/ll_parent"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="45dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_start"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="开始模糊" /><TextViewandroid:id="@+id/tv_stop"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="停止模糊" /></LinearLayout><io.alterac.blurkit.BlurLayoutandroid:id="@+id/blurLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:visibility="gone"blurkit:blk_fps="0"><TextViewandroid:layout_width="match_parent"android:layout_height="100dp"android:layout_marginTop="266dp"android:background="#fff"android:gravity="center"android:text="开始的开始,我们只是孩子"android:textColor="#f96" /></io.alterac.blurkit.BlurLayout></LinearLayout>

blurry三方框架

半成品 - Demo 效果 (模糊效果有点丑 - -)

注 :个人感觉,更适合单一控件

使用方式

 //for ViewGroup 亲测无效,可能是个人原因Blurry.with(context).radius(10)//模糊半径.sampling(8)//缩放大小,先缩小再放大.color(Color.argb(66, 255, 255, 0))//颜色.async()//是否异步.animate(500)//显示动画,目前仅支持淡入淡出,默认时间是300毫秒,仅支持传入控件为ViewGroup.onto(viewGroup);//for viewBlurry.with(context) 亲测无效,可能是个人原因.radius(10)//模糊半径.sampling(8)//缩放大小,先缩小再放大.color(Color.argb(66, 255, 255, 0))//颜色.async()//是否异步.capture(view)//传入View.into(view);//显示View//for bitmap 亲测有效Blurry.with(context).radius(10)//模糊半径.sampling(8)//缩放大小,先缩小再放大.color(Color.argb(66, 255, 255, 0))//颜色.async()//是否异步.from(bitmap)//传入bitmap.into(view);//显示View

实际使用

注:只实现了第三种使用方法

  • build.app
 implementation 'jp.wasabeef:blurry:3.0.0'
  • MainActivity
package nkwl.com.glassdemo;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;import jp.wasabeef.blurry.Blurry;public class MainActivity extends AppCompatActivity {private ImageView mAlineView;private Bitmap bitmap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mAlineView = findViewById(R.id.tv_aline_view);//本地图片转为bitmap进行数据传入bitmap = BitmapFactory.decodeResource(this.getResources(), R.mipmap.bg);findViewById(R.id.tv_start).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "开始模糊", Toast.LENGTH_LONG).show();Blurry.with(MainActivity.this).radius(10)//模糊半径.sampling(8)//缩放大小,先缩小再放大.color(Color.argb(66, 255, 255, 0))//颜色.async()//是否异步.from(bitmap)//传入View.into(mAlineView);//显示View}});findViewById(R.id.tv_stop).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "停止模糊", Toast.LENGTH_LONG).show();Blurry.with(MainActivity.this).radius(10)//模糊半径.sampling(8)//缩放大小,先缩小再放大.color(Color.argb(0, 0, 0, 0))//颜色.async()//是否异步.from(bitmap)//传入View.into(mAlineView);//显示View}});}
}
  • activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="45dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_start"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="开始模糊" /><TextViewandroid:id="@+id/tv_stop"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="停止模糊" /></LinearLayout><ImageViewandroid:id="@+id/tv_aline_view"android:layout_width="match_parent"android:layout_height="100dp"android:layout_marginTop="266dp"android:contentDescription="@null"android:gravity="center"android:scaleType="fitXY"android:src="@drawable/bg"android:visibility="visible" /></LinearLayout>

借鉴文章

  • 玉刚说推荐 - 毛玻璃效果在Android的实现
  • 原作者项目github地址 - blurkit-android

Android进阶之路 - 毛玻璃遮罩层相关推荐

  1. Android进阶之路 - 解决部分手机拍照之后图片被旋转的问题

    这几天犯了一个错误,初期想着甩锅给后台的- 但还好及时发现了是自身的问题~ 关联文章 Android基础进阶 - 调用拍照.获取图片(基础) Android基础进阶 - 获取.调用相册内图片(基础) ...

  2. Android进阶之路 - 批量下载、缓存图片、视频

    之前已经记录过,批量下载图片和缓存本地的方式,此篇主要记录批量下载图片.视频,同时缓存在本地的功能实现 关联篇 Android进阶之路 - 批量下载.缓存图片 Android进阶之路 - 批量下载.缓 ...

  3. Android进阶之路 - 软键盘中右下角的设置与监听

    在项目中,多多少少会遇到修改软键盘右下角按钮的需求,虽然已经写过几次,但是还是觉得在这里专心做个笔记比较放心 ~ 我的那些软键盘Blog ~ Android进阶之路 - 常见软键盘操作行为 Andro ...

  4. Android进阶之路 - 批量下载、缓存图片

    在日常项目开发中,关于图片批量下载,数据缓存的相关功能比比皆是,这次也是去年在项目中需要在本地缓存商品数据,所以用到了批量下载的功能,特此记录 ~ 关联篇 Android进阶之路 - 批量下载.缓存图 ...

  5. Android进阶之路 - 存、取、读 本地 Json 文件

    最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~ 如何准备一个合格的json文件? AndoridStudio中如何存放json文件? 如何读取本地Json文件数 ...

  6. 浅谈Android进阶之路

    原址 过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期.依然记得在 2010-2013 年期间,从事 ...

  7. Android进阶之路 - 顶部状态栏、底部虚拟导航栏相关操作

    快过年了,2018希望我们每个人都健康,开心,同时继续上进 ! 2020补充:基本包含了我几年在开发中用到的关于顶部状态栏和底部导航栏的绝大部分功能 ~ 顶部状态栏 状态栏是否可见 获取状态栏高度 隐 ...

  8. Android 进阶之路:ASM 修改字节码,这样学就对了!

    本文已授权个人公众号「鸿洋」原创发布. 恢复双休了,准备捡起来写博客这件事,会尝试写好每一篇博客,准备写一个「进阶之路」的系列,希望对你有用. 没错,看了很多 ASM 入门的文章,都感觉文章写的很轻松 ...

  9. Android 进阶之路(我的博客文章目录)

    原文地址:http://blog.csdn.net/u011240877 为了方便读者阅读以及自己回顾,总结写过的文章和一些想要写的文章目录如下: #1.Java Java 解惑:Comparable ...

最新文章

  1. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)
  2. spring springboot springcloud常用注解
  3. php 命名空间 create_function,PHP create_function()注入命令执行漏洞
  4. 数据结构与算法JavaScript (一) 栈
  5. 使用V-chart时配置踩过的一些坑
  6. Quartz.Net 学习随手记之03 配置文件
  7. 一张思维导图带你快速了解深度学习推荐系统
  8. 使用面向 iOS 的本机插件扩展
  9. 道路矢量数据下载教程
  10. diy高性能存储服务器,存储服务器 diy
  11. 在家搭建 Minecraft 服务器,和远程小伙伴一起联机
  12. 软件测试工程师面试题之数据库
  13. 安规电容知识详解,X电容和Y电容
  14. 皇后谜题Python
  15. 2.muduo之Channel
  16. 数据分析实战一:教育课程案例线上平台数据分析
  17. Python网络爬虫入门(五)—— 巧用抓包,爬遍SCU玻璃杯事件所有神回复
  18. 使用正则表达式进行数据校验(java,javascript)
  19. java基础语法-day31回顾集合类、I/O流
  20. 中国人民公安大学 网络对抗技术 15网安六区 杨益 201521460031

热门文章

  1. 无线移动通信技术快速发展历程和趋向
  2. Day 15 正则表达式
  3. #SATA# SATA 实际管脚接线图
  4. 常见二维码上那些奇怪的图案是什么
  5. 写给四十岁男人的忠告
  6. VSCode下载及安装
  7. WPF图片背景色过滤
  8. 如何安装iOS 13 、 macOS Catalina 、watchOS 6 、 tvOS 13 或 iPadOS Beta
  9. kubectl认证 授权 准入控制
  10. AliOS Things