滤镜效果实现

滤镜效果

先说一下,我要完成的效果:
在这里插入图片描述
给上面的的图片加上一层透明度25的黑色蒙层,或者说是一层淡黑色的滤镜。达到下面的效果。
https://androidluxi.github.io/2023/05/16/%E6%BB%A4%E9%95%9C%E6%95%88%E6%9E%9C/image-20230516135627211.png

我现在已知的有两种方法:

1.使用ImageView 的api

当设置setBackgroundDrawable时,整个ImageView的控件背景色会变。
当设置setImageDrawable时,ImageView中间内容区会被图片填充。但是周围会有一些边距,默认无法填充整个控件(当然,这也是有属性设置的)。

ScaleType的值分别代表的意义:ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式,共有8种取值

ScaleType.CENTER::图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示。

ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示。

ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小于ImageView的图片不变,直接居中显示。

ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。
 
ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。

ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。

ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。

ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放

我们将真正要显示的图片作为背景。也就是使用setBackgroundDrawable方法
透明底色的图片使用setImageDrawable方法,它会覆盖在要显示的图片上,因为是透明的,会在上面看起来是一层黑色滤镜。
如果遇到无法填充完整,就使用ScaleType属性。
将bitmap转化成drawable:BitmapDrawable bd=new BitmapDrawable(getResources(),bitmap);

BitmapDrawable是drawable的子类

2.使用setColorFilter方法

官方定义是给图片添加一个着色选项:Sets a tinting option for the image.

通过setColorFilter可以实现滤镜效果。 如: final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);

//获取壁纸 final Drawable wallpaperDrawable = wallpaperManager.getDrawable(); //指定滤镜颜色以及混合模式
wallpaperDrawable.setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);

/*注意:PorterDuff.Mode枚举值:
1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC 显示上层绘制图片
3.PorterDuff.Mode.DST 显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER 正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER 上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN 取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN 取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT 取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT 取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP 取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP 取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR //变暗
*/

如何使用:

添加滤镜:

binding.image.setColorFilter(getResources().getColor(R.color.black, null));

去除滤镜:

binding.image.clearColorFilter();

猜你喜欢

转载自blog.csdn.net/qq_43867812/article/details/130769282