Android ImageView蒙版、高斯模糊
发布日期:2021-07-01 04:33:37
浏览次数:2
分类:技术文章
本文共 5341 字,大约阅读时间需要 17 分钟。
文章目录
关于ImageView蒙版、高斯模糊的实现方法,蒙版实现原理很简单,就是继承自ImageView绘制透明涂层,高斯模糊,可以直接使用Glide中apply() 方法实现!这两个功能我封装到了一起!如下!
效果图
自定义View
package com.chengyinan.tests;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.os.Build;import android.renderscript.Allocation;import android.renderscript.Element;import android.renderscript.RenderScript;import android.renderscript.ScriptIntrinsicBlur;import android.util.AttributeSet;import android.widget.ImageView;import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;import com.bumptech.glide.load.resource.bitmap.CenterCrop;import com.bumptech.glide.request.RequestOptions;import java.security.MessageDigest;import androidx.annotation.NonNull;import androidx.annotation.Nullable;/** * 自定义MaskImageView * * @author ThirdGoddess * @email ofmyhub@gmail.com * @Github https://github.com/ThirdGoddess * @date :2020-05-23 21:54 */@SuppressLint("AppCompatCustomView")public class MaskImageView extends ImageView { private Context context; //蒙版色值 private int color = Color.parseColor("#81FFFFFF"); //是否显示蒙版 private boolean isShowMask = false; public MaskImageView(Context context) { super(context); this.context = context; } public MaskImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context = context; } public MaskImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isShowMask) { canvas.drawColor(color); } } /** * 设置蒙版颜色,可以通过类似于(#81FFFFFF)来控制透明度 */ public MaskImageView setMaskColor(int color) { this.color = color; return this; } /** * 显示蒙版 */ public void showMask() { isShowMask = true; invalidate(); } /** * 关闭蒙版 */ public void dismissMask() { isShowMask = false; invalidate(); } /** * 高斯模糊处理 * * @param radius * @return */ public Bitmap setGaussblur(int radius, Bitmap source) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { RenderScript renderScript = RenderScript.create(context); final Allocation input = Allocation.createFromBitmap(renderScript, source); final Allocation output = Allocation.createTyped(renderScript, input.getType()); ScriptIntrinsicBlur scriptIntrinsicBlur; scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); scriptIntrinsicBlur.setInput(input); scriptIntrinsicBlur.setRadius(radius); scriptIntrinsicBlur.forEach(output); output.copyTo(source); renderScript.destroy(); return source; } else { return source; } } /** * 开启高斯模糊 * * @return */ public RequestOptions setGaussBlur() { return RequestOptions.bitmapTransform(new GlideBlurTransformation(context)); } /** * 压缩Bitmap */ public class GlideBlurTransformation extends CenterCrop { private Context context; GlideBlurTransformation(Context context) { this.context = context; } @Override protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { Bitmap bitmap = super.transform(pool, toTransform, outWidth, outHeight); return blurBitmap(context, bitmap, 25, (int) (outWidth * 0.2), (int) (outHeight * 0.2)); } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { } } /** * 模糊Bitmap处理 * * @param context * @param source * @param blurRadius * @param outWidth * @param outHeight * @return */ public Bitmap blurBitmap(Context context, Bitmap source, float blurRadius, int outWidth, int outHeight) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Bitmap inputBitmap = Bitmap.createScaledBitmap(source, outWidth, outHeight, false); Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); RenderScript rs = RenderScript.create(context); ScriptIntrinsicBlur blurScript; blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); blurScript.setRadius(blurRadius); blurScript.setInput(tmpIn); blurScript.forEach(tmpOut); tmpOut.copyTo(outputBitmap); return outputBitmap; } else { return source; } }}
使用方法
设置蒙版颜色
imageView.setMaskColor(int color);//设置蒙版颜色
显示蒙版(可动态控制)
imageView.showMask();
隐藏蒙版(可动态控制)
imageView.dismissMask();
高斯模糊实现
Glide.with(Context).load(imgUrl) .apply(imageView.setGaussBlur())//这是重点 .into(imageView);
转载地址:https://myhub.blog.csdn.net/article/details/106323483 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月29日 14时43分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用libpcap过滤arp
2019-05-01
[转帖]Robots.txt指南
2019-05-01
多用户与多租户的区别
2019-05-01
Python自动化运维 - day14 - JavaScript基础
2019-05-02
oracle保存小数点前为"0"的问题
2019-05-02
ipvsadm 安装配置
2019-05-02
Linux shell脚本的字符串截取
2019-05-02
1小时点击量破千万!阿里巴巴首发:MySQL高级调优笔记!全是技术重点
2019-05-02
这个GItHub上的Java项目开源了 2021最全的Java架构面试复习指南
2019-05-02
Proftpd MySQL [Step by Step]
2019-05-02
HP-UX oracle RAC 双机实践
2019-05-02
解决SHELL脚本中的export无法生效的问题【转】
2019-05-02
linux中的sh脚本语法【转】
2019-05-02
区别数据结构中的堆栈与内存中的堆栈的个人总结【转】
2019-05-02
c++中冒号(:)和双冒号(::)的用法【转】
2019-05-02
Android深入浅出之Binder机制
2019-05-02
linux查看硬件信息
2019-05-02
linux支持大于4G内存
2019-05-02