开篇之言:
我竟忘却了来此的目的,纵我声嘶力竭,也眺望不住远处高额的山峰。我知身后寒风,也知只有向前。
——吴缘
本篇主要是讲授Paint、Canvas这两类的所有方法,通过上篇和此篇的学习,希望同学们大概能够了解到onDraw()这个方法的意义所在。
这里提醒一下,如果是在学习基础的同学,Paint的方法建议只学习这几个,setColor(),setStyle(),setAntiAlias(),setDither(),setStrokeWidth(),setTextSize()就可以了,其它的方法了解一下就行,如果执迷不悟的话,容易走火入魔。
Paint
.set(Paint src): 简单来说,就是复制传递进来的Paint对象。
.setColor(int color): 给画笔设置颜色。传递形式可以是Color.WHITE或Color.YELLOW等,也可以是Color.parseColor()。
.setStyle(Style style): 给画笔设置样式风格。Style.FILL:画笔填充充满,如果绘制的是闭合图形,则闭合的区域将会被填满画笔的颜色;Style.STROKE:跟Style.FILL相反,它让画笔只绘制轮廓,即线条风格;Style.FILL_AND_STROKE:使用的效果跟Style.FILL差不多,不常用。
.setTextSize(float textSize): 设置画笔所要绘制的文本的字体大小,只针对文本。
.setAntiAlias(boolean aa): 为画笔设置抗锯齿,对抗锯齿不理解的可以去百度抗锯齿的定义,简单来说就是优化边缘,防止图形边缘产生明显的锯齿痕迹。
.setAlpha(int a): 设置画笔的透明度,就像毛笔蘸墨水,要浓要淡都行。
.setARGB(int a,int r,int g,int b): 设置画笔的颜色通道,从左至右依次是透明通道、红色通道、绿色通道、蓝色通道。可以通过此方法改变所要绘制的图像中透明度和红绿蓝的增量,可以达到图像变暗变亮、图像中某种颜色突出,某种颜色暗淡等等效果。
.setColorFilter(ColorFilter filter): 为画笔设置颜色过滤器,是通过颜色矩阵和颜色分量产生的矩阵运算从而改变图像颜色的方法,可以说是setARGB()方法的进阶版,也更加复杂,这里推荐一个大神的博客,如果你处于基础学习,不要深入,了解一下就可以了。自定义控件三部曲之绘图篇(九)——Paint之setColorFilter
.setPathEffect(PathEffect effect): 为画笔的路径设置需要的效果(使用此方法时要关闭硬件加速,如何关闭请自行百度)。比如两个点之间,我们相连它们,我们可以画一条直线,也可以画一条虚线,又或者一段直线一个点。也就是说相同的两个点之间,可以由很多种连接方式。相同的,同样一条路径也有很多种表现方式。在这里首先要清楚路径的定义,不要混淆路径和直线的概念。如果要画虚线,就可以用这个方法,PathEffect有六个子类,分别是ComposePathEffect(组合效果)、CornerPathEffect(平滑效果)、DashPathEffect(虚线效果)、DiscretePathEffect(离散效果)、PathDashPathEffect(图形效果)、SumPathEffect(叠加效果)。处于基础的同学不要深入,这里推荐一个大神的博客。 详解Paint的setPathEffect(PathEffect effect)
.setDither(boolean dither): 为画笔设置防抖动,跟setAntiAlias()方法用法一样,一个是防止轮廓锯齿化,一个是防止图像内部出现抖动痕迹,都是优化图像的方法。下面右边的图虽也有瑕疵,但比左边的图来说已经好了许多。
.setElegantTextHeight(boolean elegant): 这个方法对于中国人来说没有用处,因为这个方法是针对于某些语言,比如泰语中有些单词是很高的,打个比方,在三线格上写英语单词是,最高的单词也就占三行,但是在泰语的某些单词上,甚至能占五六行,所以安卓为了美化单词直观效果,对这些过高的单词是进行了压缩的,当然,在泰国等国本地,他们需要语言的原直观效果的话就可以调用这个方法,传值为true就行,中国汉字并没有这么高的词语,所以对于中国人来说,用不到此方法。
.setFakeBoldText(boolean fakeBoldText): 使字体变粗的方法,带Text的方法都是针对字体的,一般都很简单,只要明白单词意思就会使用了。
.setFilterBitmap(boolean filter): 对图像进行滤波处理,让图像更好更流畅的显示。此方法也是优化方法,一般同setAntiAlias()方法一起使用,在图像进行旋转动画的时候用到的方法。这里推荐一个详细解释的博客,抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
.setFlags(int flags): 为画笔设置标志,同setStyle()一样,都是对画笔设置样式的,通常在画笔生成时就传入标志,例如mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
.setHinting(int mode): 设置画笔的微调模式,针对于矢量字体过小而造成模糊不清的情况,但随着手机的发展,手机像素越来越高的情况下,这个方法已经被淘汰了,可以弃用了。
.setLetterSpacing(float letterSpacing): 设置文本行间距的,默认为0;
.setLinearText(boolean linearText): 设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。(这个方法我没有用过,这里对它的了解是复制来的,想了解的同学不介意深入,知道有这么个东西就行。)
.setMaskFilter(MaskFilter maskfilter): 此方法是用来对图像进行一定的处理,比如遮罩、阴影等。如果你需要对图像的边缘内外进行模糊处理,或使图像产生阴影效果,就可以用此方法。这里推荐一个大神详细的博客,详解Paint的setMaskFilter(MaskFilter maskfilter),用此方法时注意关闭硬件加速。
.setShader(Shader shader): 为图像进行着色渲染的方法,这是一个很有用的方法,感兴趣的同学可以去看下大神的博客,这里推荐一个,Canvas&Paint 知识梳理(5) - Paint#setShader
.setShadowLayer(float radius,float dx,float dy,int shadowColor): 此方法也不支持硬件加速,用时注意关闭。radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。此方法跟BlurMaskFilter效果是一样的,但setShadowLayer比它更简单方便,但BlurMaskFilter能做到的,setShadowLayer不一定做得到。所以这里建议想要达到效果的同学苦一点去学习BlurMaskFilter。
.setStrokeCap(Paint.Cap cap): 该方法用来设置我们画笔的笔触风格,比如:ROUND,表示是圆角的笔触。那么什么叫笔触呢,其实很简单,就像我们现实世界中的笔,如果你用圆珠笔在纸上戳一点,那么这个点一定是个圆,即便很小,它代表了笔的笔触形状,如果我们把一支铅笔笔尖削成方形的,那么画出来的线条会是一条弯曲的“矩形”,这就是笔触的意思。除了ROUND,Paint.Cap还提供了另外两种类型:SQUARE和BUTT。
.setStrokeJoin(Paint.join join): 这个方法用于设置接合处的形态,就像你用代码画了一条线,但是这条线其实是由无数条小线拼接成的,拼接处的形状就由该方法指定。可选参数是:BEVEL,MITER,ROUND。
.setStrokeWidth(float width): 这个方法是用来设置画笔的笔宽的,也就是笔刷的粗细度。
.setStrokeMiter(float miter): 设置笔画的倾斜度,取值:>=0。如:小时候用的铅笔,削的时候斜与垂直削出来的笔尖效果是不一样的。主要是用来设置笔触的连接处的样式。可以和setStrokeJoin()来比较比较。
.setXfermode(Xfermode xfermode): 设置图像的混合模式,在两个或多个以上图像进行重合混合时所用到的方法,这里有大神分了三篇博客讲解,讲的很清楚,自定义控件三部曲之绘图篇(十)——Paint之setXfermode(一)、自定义控件三部曲之绘图篇(十一)——Paint之setXfermode(二)、自定义控件三部曲之绘图篇(十二)——Paint之setXfermode(三)
哇,是真的累,这里Paint的所有方法都在这里了,要特别注意那些需要关闭硬件加速的方法,本来想一篇博客同时写完Paint和Canvas的所有方法的,这里光Paint就写了一下午,溜了溜了,休息一波。这里推荐的博客如果还有看不懂的同学,如果以后有机会时间,我会自己开一篇原创的博客进行讲解。