相关文章推荐
威武的日记本  ·  Spark SQL - How to ...·  1 年前    · 

关于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);
有两种方法可以使用这个库。 两者都涉及克隆这个项目。
 一,通过从根文件夹运行./gradlew jar来构建库 jar。 这将在library/build/libs/文件夹中创建MaskedImageView.jar 。 将此 jar 添加到您的项目依赖项中。
 二、将该库作为 Android 库添加到您的项目中。 您可以在库文件夹中找到所有文件。
使用这个超级简单。
 确保定义自定义 XML 命名空间xmlns:custom="http://schemas.android.com/apk/res-auto" 。
 将<nl>标记添加到您的布局,并以与任何Im
     .error(R.drawable.error_img)
     // 设置高斯模糊
     .bitmapTransform(new BlurTransformation(this, 14, 3))
     .into(imageview);
适用场景:动态配置的背景图片
2、对图片高斯模糊,需要先将图片转成bitmap对象
mport android.annotation.TargetApi;
import a
实现思路:
在界面出来之后,获取相应的坐标,然后传坐标到startActivity一个新的界面,该界面背景是带透明度的,界面上添加一个根据坐标点镂空的TipsView
下面一步步实现
步骤一:自定义镂空控件TipsView
示例代码:
public class TipsView extends FrameLayout {
private final Context mContext;
private int[] mCircleLocatio
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXf.
                                    图片处理是android开发常用的,之前需求加载圆形,圆角,圆形加边框,最近在项目中遇到要处理高斯模糊效果,看了网上几种方案,调试了半天,效果还不错,于是总结出以下几种方式:
1.使用glide方式,代码如下
//Glide实现图片高斯模糊
Glide.with(this).load(R.mipmap.image)
        .apply(bitmapTransform(new B...
                                    L2-011&period; 玩转二叉树aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA28AAAHQCAIAAAC5rsUiAAAgAElEQVR4nO3dzYts953n+foXcpUL0QAndroid -- 软键盘1. 应用启动后,自动打开软键盘 InputMethodManager imm = (InputMethodManager)...
                                    实现这个功能的关键是: 你需要知道哪个button处需要给个指引的高亮显示,这个涉及到坐标的运算,免得位置放偏。先给大家看看做的效果图:把没有做好的也放上去,这样更容易看出问题和需要注意的地方。(图一是没有设置padding,效果不好;图二是是指padding之后的效果,但是位置没有对准;图三才是正确的姿势)看实现过程:
                                    在以前的开发中遇到过要求图片实现高斯模糊的效果,今天整理一下,发出来,供参考注意:对图片的各种处理大多数是通过bitmap进行操作的,本例也不例外,另外本例是使用imageloader加载的网络图片,以给大家一个模糊网络图片的参考,当然,加载网络图片必然是异步的,所以首次进入界面加载图片时会有一个等待时间,如果想要完美用户体验的话,就需要大家开动脑筋了!下面是关于高斯模糊的工具类:BitmapVa...