前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >android 绘图之Paint的效果研究

android 绘图之Paint的效果研究

原创
作者头像
八神太一
发布于 2022-02-06 11:51:18
发布于 2022-02-06 11:51:18
92500
代码可运行
举报
文章被收录于专栏:androudandroud
运行总次数:0
代码可运行

在Paint中有很多的属性可以设置,比如可以设置阴影,颜色过滤等等,这些会产生不同的奇妙效果,今天就对各种属性探索一下。

方法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置绘制的颜色,a代表透明度,r,g,b代表颜色值。setARGB(int a,int r,int g,int b);

这个不多说了,还有两个类似的方法,将设置alpha和rgb分割开来了。注意的是这里的a值是0~255的范围,不是小数。

方法二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setAntiAlias(boolean aa);

也不多说,你可以试验一下效果,设置后会平滑一些;

方法三:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 setDither(boolean dither);

方法四:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等setMaskFilter(MaskFilter maskfilter);

MaskFilter类可以为Paint分配边缘效果。 对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter: BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。 EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。 要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象。下面的例子是对一个已经存在的Paint应用一个EmbossMaskFilter:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 设置光源的方向float[] direction = new float[]{ 1, 1, 1 };//设置环境光亮度float light = 0.4f;// 选择要应用的反射等级float specular = 6;// 向mask应用一定级别的模糊float blur = 3.5f;EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);// 应用maskmyPaint.setMaskFilter(emboss);

可以看一下下面的图,是不是有浮雕的效果??

再看下面使用BlurMaskFilter:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//前面一个控制阴影的宽度,后面一个参数控制阴影效果maskFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID);

是不是有阴影效果呢??

方法五:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果setColorFilter(ColorFilter colorfilter);

这个方法也值得试验一下:

MaskFilter是对一个Paint的alpha通道的转换,而ColorFilter则是对每一个RGB通道应用转换。所有由ColorFilter所派生的类在执行它们的转换时,都会忽略alpha通道。

这个貌似比较麻烦,改天再说。

方法六:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置绘制路径的效果,如点画线等setPathEffect(PathEffect effect);

又是一个很好玩的方法:

到目前为止,所有的效应都会影响到Paint填充图像的方式;PathEffect是用来控制绘制轮廓(线条)的方式。PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。 使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括: 1)CornerPathEffect  可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。

2)DashPathEffect  可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。

3)DiscretePathEffect 与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。

4)PathDashPathEffect  这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。 下面的效果可以在一个Paint中组合使用多个Path Effect。 1)SumPathEffect 顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。 2)ComposePathEffect  将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。 对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。 使用setPathEffect方法可以把PathEffect应用到Paint对象中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
paint.setPathEffect(new CornerPathEffect(10));

其他效果懒得测试了,这个在模拟器上跑的时候效果也不明显,但是真机上跑的时候的确圆滑了许多,看上去很舒服

方法七:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果setXfermode(Xfermode xfermode);

橡皮擦,这是个好方法啊,看看。

可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。 在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。下面的Xfermode子类可以改变这种行为: 1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。 2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。 3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。 要应用转换模式,可以使用setXferMode方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);

这里可以实现完美的橡皮擦功能!代码异常简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);paint.setXfermode(xFermode);

这是使用的最后一个子类,关于16条Porter-Duff规则,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final Xfermode[] sModes = {            new PorterDuffXfermode(PorterDuff.Mode.CLEAR),            new PorterDuffXfermode(PorterDuff.Mode.SRC),            new PorterDuffXfermode(PorterDuff.Mode.DST),            new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),            new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),            new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),            new PorterDuffXfermode(PorterDuff.Mode.DST_IN),            new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),            new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),            new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),            new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),            new PorterDuffXfermode(PorterDuff.Mode.XOR),            new PorterDuffXfermode(PorterDuff.Mode.DARKEN),            new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),            new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),            new PorterDuffXfermode(PorterDuff.Mode.SCREEN)        };

它们每个显示的效果具体如下:

第一个就是Clear效果!

上面很多的图都是由SDK APIDemos运行所得~~有时间仔细研究一下Graphics中的每个Activity。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Paint基本使用
Paint 基本使用 《Paint的方法主要可以抽象成两大类》: 1.1 负责设置获取图形绘制、路径相关的 1.setStyle(Paint.Style style) 设置画笔样式,取值有 Paint.Style.FILL :填充内部 Paint.Style.FILL_AND_STROKE :填充内部和描边 Paint.Style.STROKE :仅描边、 注意STROKE、FILL_OR_STROKE与FILL模式下外轮廓的位置会扩大。 2.setStrokeWidth(float width) 设置画
aruba
2020/07/03
1.1K0
android 绘图之Path与Paint详解
/** * Paint类介绍 * * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。 * * 1.图形绘制 * setARGB(int a,int r,int g,int b); * 设置绘制的颜色,a代
八神太一
2022/02/06
8980
android有关paint属性设置
转自:http://wangchangshuai0010.iteye.com/blog/1441467 /** * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, * 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法, * 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。 * * <strong><span style="color:
forrestlin
2022/04/02
1.1K0
Android自定义View【实战教程】3⃣️----Paint类、Path类以及PathEffect类详解
Style.FILL:实心 Style.FILL_AND_STROKE:同时显示实心和空心 Style.STROKE:空心
先知先觉
2019/01/21
1.3K0
2014-10-27Android学习------布局处理(六)------26个字母的布局列表的实现-----城市列表应用程序
我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个CityList 源码 百度搜就知道很多下载的地方
wust小吴
2022/03/07
8180
2014-10-27Android学习------布局处理(六)------26个字母的布局列表的实现-----城市列表应用程序
Android实现仿iOS图标下载View动画效果
因为时间比较紧张,8 天的时间完成环信客服模块的接入,就直接用了环信提供的 UI 控件,但是一些细节的部分, UI 还是会给出设计图,按照设计图完成最终效果。
CCCruch
2019/06/11
1.7K0
Android实现仿iOS图标下载View动画效果
Xfermode in android
Xfermode有三个实现类:AvoidXfermode, PixelXorXfermode以及PorterDuffXfermode。 前两个类因为不支持硬件加速在API level 16被标记为Deprecated了,用也可以,但是需要关闭硬件加速,简单说下。
weishu
2018/09/05
1.3K0
Xfermode in android
感受一波Android自定义view实现超萌动感小炸弹!!
下面我们和自定义view实现超萌动感天气小太阳一样,开始解析动画!(没看过天气小太阳的朋友可以先去看天气小太阳,有些天气小太阳讲过的套路将不再讲,同时需要掌握path、camera、贝塞尔曲线等,不然部分代码可能会引起不适)。
用户9239674
2021/12/12
5250
自定义view实现超萌动感小炸弹
Hello,小伙伴们,我回来了。这些日子有的小伙伴问我怎么没有更新了。这个其实是有原因,首先,最近有点忙。其次没有看到什么觉得好玩的动画!最后,就是我更新过了!!ThreadLocal源码完全解析,只是你们源码不感冒,然后你们忽略了!!!!忽略了!!!还有,我其实有更新一个薄荷卷尺,只是觉得有点简单,而且还像也有什么好讲的,所以只是上传到github,没有文章。 客套话已经完了,现在开始我们的超萌动感小炸弹之旅。 首先,我还是先感谢一下作者,设计出这么棒的动画!!设计出处点我。 效果如下,Amazing:
用户2802329
2018/08/07
7510
自定义view实现超萌动感小炸弹
Android滤镜--Alpha值滤镜处理之MaskFilter
所谓的滤镜效果就是对图像进行一定的颜色过滤处理,颜色值是32位的int值,ARGB :A---Alpha值,RGB---颜色值 安卓中对Alpha值的滤镜处理就是利用MaskFilter,其中有两个子类继承MaskFilter BlurMaskFilter--用来绘制模糊阴影 /** * Create a blur maskfilter. * * @param radius 阴影的半径 * @param style NORMOL -- 整个图像都被模糊掉
aruba
2020/07/03
1.4K0
Android滤镜--Alpha值滤镜处理之MaskFilter
Android关于Color你所知道的和不知道的一切
零、前言 1.做安卓的大多应该对颜色不太敏感,毕竟咱是敲代码的,颜色有设计师呢。 2.不过作为一名在大学被颜色熏(陶)过四年的人,对颜色多少还是挺亲切的(虽然当时挺讨厌的) 3.纪念也好,记录也罢,为它写篇总结也理所应当 4.如果你觉得并不需要了解关于颜色的知识,那你可以将本文当做一篇科普文(出去跟人家吹吹牛还是够用的) ---- 一、颜色知识科普: 这一切都要从光开始: 有个叫牛顿的人拿一块三棱镜将太阳光折射出了彩色产生色散现象: ----色散现象说明光在介质中的速度v=c/n(或折射率n)随
张风捷特烈
2018/12/11
2.8K0
Android关于Color你所知道的和不知道的一切
Android自定义系列——6.PorterDuffXfermode
在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,这样会创建很多有趣的效果。当使用PorterDuffXfermode时,需要将将其作为参数传给Paint.setXfermode(Xfermode xfermode)方法,这样在用该画笔paint进行绘图时,Android就会使用传入的PorterDuffXfermode,如果不想再使用Xfermode,那么可以执行Paint.setXfermode(null)。
老马的编程之旅
2022/06/22
1.2K0
Android自定义系列——6.PorterDuffXfermode
Android--水波纹进度条
实现方法是结合贝塞尔曲线和Xfermode,核心是利用path的offset()方法,不断偏移path /** * 水波纹进度条 */ public class BezierProgressView extends View { private float progress; private float maxProgress; private int radius; private int circleColor; private int waveColor;
aruba
2020/07/03
1.1K0
Android--水波纹进度条
自定义控件详解(六):Paint 画笔MaskFilter过滤
首先看一个API:setMaskFilter(MaskFilter maskfilter): 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等。 以下有两个MaskFilter的子类可供选择: BlurMaskFilter:指定了一个模糊的样式和半径来处理Paint的边缘。 EmbossMaskFilter:指定了光源的方向和环境光强度来添加浮雕效果。 下面用Demo来看效果: 一、BlurMaskFilter(模糊效果) public class XBlurMas
听着music睡
2018/06/08
1.2K0
[BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角。思路是利用“Xfermode + Path”来进行Bitmap的裁剪。
用户1172465
2018/01/08
3.8K0
[BOT] 一种android中实现“圆角矩形”的方法
android绘制虚线
有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种: 一、自己创建模式,一个点一个点的绘制。 二、用Android提供的 Das
xiangzhihong
2018/01/29
2.4K0
自定义View学习之路(二)————Paint与Canvas
  Canvas可以理解为画布,配置好画笔后,我们可以调用Canvas的各种绘制方法。   绘制直线:canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint);   绘制矩形:canvas.drawRect(float left, float top, float right, float bottom, Paint paint);   绘制圆形:canvas.drawCircle(float cx, float cy, float radius, Paint paint);   绘制字符:canvas.drawText(String text, float x, float y, Paint paint);   绘制图形:canvas.drawBirmap(Bitmap bitmap, float left, float top, Paint paint);
饮水思源为名
2018/09/06
4730
Paint的setStrokeCap、setStrokeJoin、setPathEffect
注意: Paint.Cap.ROUND、Paint.Cap.SQUARE 会在线长度的基础上首尾添加一个通过 setStrokeWidth 设置的宽度。
103style
2022/12/19
2570
Paint的setStrokeCap、setStrokeJoin、setPathEffect
手撕一个让人「欲罢不能」的水波纹选中控件
在 Android 5.0 以后,随着 Material Design 的提出,Android UI 设计语言可谓是提升了一大步,但是在国内其实并没有得到很大的推广应用。
开发的猫
2020/04/01
1.2K0
手撕一个让人「欲罢不能」的水波纹选中控件
Android绘图及Bitmap几个知识点整理
这里推荐使用第一种,实现简单,而且不需要像方法2那样设置一个固定的角度(设置固定角度的效果不是很适用于所有角度的折线);
HoLoong
2020/09/21
1.4K0
相关推荐
Paint基本使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档