Paint效果相关

2018-11-16  本文已影响0人  jadefly

效果相关:锯齿、绘制风格、线条风格、色彩优化、轮廓风格、阴影、浮雕等


抗锯齿

锯齿现象:图形分辨率过低,肉眼能察觉像素颗粒(实际图片已经是完美的)

抗锯齿:通过精细算法修改图形边缘处的像素颜色,使肉眼看起来更加平滑(其实使图片失真了)

效果

设置抗锯齿:setAntiAlias (true) ;或 new Paint(Paint.ANTI_ALIAS_FLAG);


绘制风格

setStyle(Paint.Style style)

              FILL:填充模式(默认)

              STROKE:画线模式(即勾边模式)

              FILL_AND_STROKE:两种模式一并使用,既画线又填充


线条风格

setStrokeWidth(float width)

简介:设置线条宽度,默认值是 0像素(依旧能画出像素为1的线)

区别:线条宽度为1,几何变换放大两倍,线条绘制宽度为2

           线条宽度为0,几何变换放大两倍,线条绘制宽度总是为1(hairline mode发际线模式)

setStrokeCap(Paint.Cap cap)

简介:设置线头的形状,三种:BUTT 平头(默认)、ROUND 圆头、SQUARE 方头

注:虚线左边为线的实际长度。

效果

setStrokeJoin(Paint.Join join)

简介:设置拐角的形状,三种:MITER 尖角(默认)、 BEVEL 平角和 ROUND 圆角

效果

setStrokeMiter(float miter)

简介:建立在使用setStrokeJoin()上,用于设置MITER尖角型拐角的延长线的最大值

尖角补偿

注:如果尖角过长,自动改用BEVEL平角来渲染连接点

       所以miter参数是对于转角长度的限制,默认值4,大约29度的锐角


色彩优化

setDither(boolean dither)

简介:设置抖动来优化色彩深度降低时的绘制效果

抖动:在图像降低色彩深度绘制时,插入噪点有规律扰乱图形来,避免出现大片的色带与色块,使图像对于肉眼更真实。

使用场景:适合于自建bitmap选择低色彩深度ARGB_4444 或者 RGB_565的时候

                  (由于现在色彩深度使用ARGB_8888,抖动没以前那么实用了)

效果

setFilterBitmap(boolean filter)

简介:设置双线性过滤来优化 Bitmap 放大绘制的效果

双线性过滤:图像放大绘制时,默认使用最近邻插值过滤,会出现马赛克现象,开启双线性过滤让图像显得更加平滑

效果

图形的轮廓风格

setPathEffect(PathEffect effect)

PathEffect 分为两类:单一效果的 CornerPathEffect,DiscretePathEffect,DashPathEffect,PathDashPathEffect 

                                    组合效果的 SumPathEffect,ComposePathEffect

CornerPathEffect

简介:把拐角变成圆角,radius圆角半径

使用:mPaint.setPathEffect(new CornerPathEffect(50));

效果

DiscretePathEffect

简介:离散效果,把线条进行随机的偏离,"杂点"密集时可模拟生锈铁丝的效果

使用:mPaint.setPathEffect(new DiscretePathEffect(3.0F, 5.0F));

参数:segmentLength:用来拼接的每个线段的长度

           deviation:与原始路径的偏离度

效果

DashPathEffect

简介:使用虚线来绘制线条

使用:paint.setPathEffect(new DashPathEffect(new float[]{50,10}, 0));

参数:intervals:float[]参数必须成对且>=2,参数1表示实线的长度,参数2表示空白线的长度;

                            new float[]{20,10}:第一条实线20,第二条空白线10,循环。(即20,10,20,10)

                            newfloat[] {20, 10, 50, 5, 100, 30, 10, 5}:对每个实线和空白线进行设置

           phase:绘制时的偏移量;(如果实线长10,偏移3,则实线从3~10部分开始绘制长度为7的实线)

拓展:利用DashPathEffect实现路径跟踪绘制的动画效果(比如心电图动画,实际时一直改变phase值)

效果

PathDashPathEffect

简介:使用一个Path来绘制虚线(自定义虚线样式)

使用:new PathDashPathEffect(path, advance, phase,PathDashPathEffect.Style.ROTATE);

参数:shape:用来绘制的 Path

           advance:是两个相邻的 shape 段 [ 起点 ] 之间的间隔(非前一个终点和后一个起点)

           style:三种:TRANSLATE 位移、ROTATE 旋转、MORPH 变体

效果

SumPathEffect

简介:按照两种PathEffect分别对目标进行绘制(两效果互不干扰)    

效果

ComposePathEffect

简介:先对一个目标Path使用innerpePathEffect,再对改变的目标path使用outerpePathEffect

效果

关闭硬件加速的场景

1.使用Canvas.drawLine() 和 Canvas.drawLines() 方法画直线时

2.使用PathDashPathEffect 时


绘制后添加额外效果

setShadowLayer(float radius, float dx, float dy, int shadowColor)

简介:在之后的绘制内容下面加一层阴影

参数:radius:阴影的模糊范围

           dx,dy:阴影的偏移量

           shadowColor:阴影的颜色

注:1.文字之外的绘制必须关闭硬件加速才能正常绘制阴影

        2.如果shadowColor阴影颜色本身是半透明的,阴影的透明度就使用本身

           如果本身不透明,阴影的透明度就使用paint 的透明度

效果

setMaskFilter(MaskFilter maskfilter)

简介:为之后的绘制设置 MaskFilter,基于整个画面来进行过滤(API14以上需关闭硬件加速)

1.BlurMaskFilter:模糊效果

   构造:BlurMaskFilter(float radius, BlurMaskFilter.Blur style)

   参数:radius:模糊的范围

              style:模糊的类型NORMAL、SOLOD、INNER、OUTER

效果

2.EmbossMaskFilter:浮雕效果

    构造:EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

    参数:direction:浮点型数组,控制x,y,z轴的光源方向

               ambient:环境光的强度,数值范围是 0 到 1

               specular:炫光/镜面反射的系数

               blurRadius:应用光线的范围

效果

获取绘制的 Path

getFillPath(Path src, Path dst)

简介:获取实际path,src 是原 Path,dst 就是实际 Path 的保存位置

实际path:drawPath() 的绘制内容的轮廓,要算上线条宽度和设置的 PathEffect

效果

getTextPath(String text, int start, int end, float x, float y, Path path) 

getTextPath(char[] text, int index, int count, float x, float y, Path path)

简介:获取文字的path

文字的path:文字信息全是被转化成图形,对图形进行绘制的

效果

初始化类相关

reset():重置 Paint 的所有属性为默认值(相当于重新new,但性能更高)

set(Paint src):把 src 的所有属性全部复制过来

setFlags(int flags):可批量设置 flags

                                paint.setFlags(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);

                            =  paint.setAntiAlias(true);    +      paint.setDither(true);

上一篇 下一篇

猜你喜欢

热点阅读