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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Kotlin Android开发·认识和了解Kotlin
下一篇:Android基础面试常常吊死在这几个问题上,1个、2个、3个、4个、5个、6个、7个、8个、9个、10个......

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月29日 14时43分01秒