关闭

Android中View绘图总结

标签: androidcanvas画图
2048人阅读 评论(0) 收藏 举报
分类:

在Android中我们自定义View的时候,往往会用到绘图操作,下面主要把相关函数进行总结。

在View的onDraw()函数中,我们一般使用Canvas来绘图,Canvas相当于画布。

一、说说Canvas
canvas操作分三类:
1、save、restore等与层保存和回滚相关的方法
我们每执行一次save,相当于就将当前的绘制的内容当做一个图层保存起来,这些我们后面的绘制就在另一个图层中进行,当我们执行restore就相当于返回到之前缓存的那个图层中。图层的缓存是以栈的形式保存起来的。

2、scale、rotate、translate、skew、clip等画布的操作方法。

实现剪裁功能
Canvas提供了ClipPath, ClipRect, ClipRegion 等方法来裁剪
clipPath
clipRect
clipRegion

实现画布的缩放、旋转、平移或者错切效果
scale
rotate
translate
skew

具体参考文章: Canvas之translate、scale、rotate、skew方法讲解!

3、drawXXX等绘图方法

绘图

(1)画布颜色填充
drawARGB
drawColor
drawRGB

画点
drawPoint 绘制一个点
drawPoints 绘制多个点

画线
drawLine 绘制线
drawArc 绘制弧
drawPath 绘制路径
drawRect
drawRoundRect 绘制圆角矩形

画形状
drawOval 绘制椭圆
drawRect 绘制矩形

画图
drawBitmap 绘制位图
drawBitmapMesh 绘制扭曲位图
drawPicture

画文本
drawText 绘制字符串
drawTextOnPath 沿着路径绘制字符串
drawTextRun
drawPosText

二、说说Paint
在使用Canvas的时候,我们经常会用到Paint,下面来看看Paint类

1.图形绘制设置
setARGB(int a,int r,int g,int b);
设置绘制的颜色,a代表透明度,r,g,b代表颜色值。

setAlpha(int a);
设置绘制图形的透明度。

setColor(int color);
设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。

setAntiAlias(boolean aa);
设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。

setDither(boolean dither);
设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰

setFilterBitmap(boolean filter);
如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置

setMaskFilter(MaskFilter maskfilter);
设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等

setColorFilter(ColorFilter colorfilter);
设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果

setPathEffect(PathEffect effect);
设置绘制路径的效果,如点画线等

setShader(Shader shader);
设置图像效果,使用Shader可以绘制出各种渐变效果,类android.graphics.Shader有五个子类,分别是:BitmapShader、LinearGradient、RadialGradient、SweepGradient和ComposeShader

setShadowLayer(float radius ,float dx,float dy,int color);
在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色

setStyle(Paint.Style style);
设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE

setStrokeCap(Paint.Cap cap);
当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式 Cap.ROUND,或方形样式Cap.SQUARE

setSrokeJoin(Paint.Join join);
设置绘制时各图形的结合方式,如平滑效果等

setStrokeWidth(float width);
当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度

setXfermode(Xfermode xfermode);
设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果

2.文本绘制设置
setFakeBoldText(boolean fakeBoldText);
模拟实现粗体文字,设置在小字体上效果会非常差

setSubpixelText(boolean subpixelText);
设置该项为true,将有助于文本在LCD屏幕上的显示效果

setTextAlign(Paint.Align align);
设置绘制文字的对齐方向

setTextScaleX(float scaleX);
设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果

setTextSize(float textSize);
设置绘制文字的字号大小

setTextSkewX(float skewX);
设置斜体文字,skewX为倾斜弧度

setTypeface(Typeface typeface);
设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等

setUnderlineText(boolean underlineText);
设置带有下划线的文字效果

setStrikeThruText(boolean strikeThruText);
设置带有删除线的效果

清空画布

// 清空画布
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(paint);

文章:
Paint使用讲解

三、说说Path
moveTo 设置画笔的位置

lineTo 用于进行直线绘制。

quadTo 用于绘制圆滑曲线,即贝塞尔曲线。
mPath.quadTo(x1, y1, x2, y2) (x1,y1) 为控制点,(x2,y2)为结束点。

cubicTo 同样是用来实现贝塞尔曲线的。
mPath.cubicTo(x1, y1, x2, y2, x3, y3) (x1,y1) 为控制点,(x2,y2)为控制点,(x3,y3) 为结束点。

cubicTo 和 quadTo 有什么不一样呢?就是多了一个控制点而已。

arcTo 用于绘制弧线(实际是截取圆或椭圆的一部分)。
mPath.arcTo(ovalRectF, startAngle, sweepAngle) , ovalRectF为椭圆的矩形,startAngle 为开始角度,sweepAngle 为结束角度。

文章:
Path相关方法讲解(一)
Path相关方法讲解(二)

PathMeasure介绍
重点看下常用方法:

float getLength()
返回当前contour的长度,也就是这一个Path有多长

boolean getPosTan(float distance, float[] pos, float[] tan)
传入一个距离distance(0<=distance<=getLength()),然后会计算当前距离的坐标点和切线,注意,pos会自动填充上坐标,这个方法很重要

boolean getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo) 传入一个开始和结束距离,然后会返回介于这之间的Path,在这里就是dst,他会被填充上内容,这个方法很重要

boolean nextContour() 移动到下一个笔画,如果你的Path是由多个笔画组成的话,那么就可以使用这个方法

void setPath(Path path, boolean forceClosed)这个方法也比较重要,用来设置新的Path对象的,算是对第一个构造函数的一个补充

文章:
Path特效之PathMeasure打造万能路径动效
仿支付宝付款成功及”天女散花”效果实现——看PathMeasure大展身手

============================================
推荐文章
android动效开篇

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:418080次
    • 积分:7192
    • 等级:
    • 排名:第3479名
    • 原创:267篇
    • 转载:31篇
    • 译文:22篇
    • 评论:59条
    成长轨迹
    目前研究方向:Android,React Native,机器学习

      微信公众号:DroidMind
      (欢迎关注)