关闭

Android中View绘图总结

标签: androidcanvas画图
2349人阅读 评论(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
查看评论

Android组件Activity中的View绘画和动画(Animation)是否会重画?

Activity 就是Android中的活动,是Android系统中唯一一个可见组件。 Activity中官网中有一句话: The visible lifetime of an activity happens between a call to onStart()&...
  • abcdefh123
  • abcdefh123
  • 2015-04-12 21:43
  • 1231

关于view的drawRect多次被调用出现绘图重叠问题

如用纯代码书写如果多次调用setNeedsDisplay出现绘图重叠现象. 解决办法:初始化时设置背景色. -(instancetype)initWithFrame:(CGRect)frame {     self = [super initWithFrame:fr...
  • flyldq
  • flyldq
  • 2016-12-21 11:25
  • 448

Android实战技巧之二十九:画布Canvas

Android Framework提供了一些2D画图的API,android.graphics包就是其中之一。 为了画一些东西,需要4个元素(或称组件)协同来完成: * 位图:Bitmap来保持(hold)那些像素 * 画布:Canvas来响应画画(draw)的调用(并将其写入bitmap) ...
  • lincyang
  • lincyang
  • 2015-05-07 13:29
  • 14544

achartengine分段画动态曲线,可局部刷新

  • 2016-01-25 09:56
  • 7.57MB
  • 下载

自定义View之绘图篇(一):基础图形的绘制

生活是一面镜子,你对它笑,它就对你笑;你对它哭,它也对你哭。——萨克雷在正文开始之前,我先抛一个脑洞大开的题目给大家:商人以45元一双进购了2双鞋子,然后亏本30一双出售。某个顾客给了他100买了2双鞋子,商人没零钱找于是拿着这100找邻居换了100的零钱,后来邻居发现这100是假的,商人只得陪了邻...
  • u012551350
  • u012551350
  • 2016-05-06 00:29
  • 9199

Android View自定义控件画图

## 自定义控件 1. 自定义组合控件:将原生的控件组合在一起使用,就叫自定义控件 2. 自定义view: 系统原生没有,需要自己手动绘制,自己处理事件 ## View的绘制流程 ## 1. 测量 2. 布局 3. 绘制 直接上码 package zenglei.com.drawing; ...
  • a873282620
  • a873282620
  • 2016-10-10 15:21
  • 1081

Android 绘图和shape圆形

实现: shape可以绘制矩形环形以及椭圆,所以只需要用椭圆即可,在使用的时候将控件比如imageview或textview的高宽设置成一样就是正圆,solid表示远的填充色,stroke则代表远的边框线,所以两者结合可以实现带边缘的圆,当然也可以直接加上size控制高宽,下面的代码实现效果是一个...
  • linghu_java
  • linghu_java
  • 2015-06-07 20:46
  • 65730

2.在Android屏幕上画图

分两个类实现:分别是Draw类
  • u014129816
  • u014129816
  • 2014-10-10 21:38
  • 911

Android画图操作笔记总结

一、drawBitmap基本用法 1、基本的绘制图片方法    //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置     drawBitmap(Bitmap bitmap, float left, floa...
  • fngy123
  • fngy123
  • 2014-12-30 23:37
  • 646

Android自定义View(一)View绘制流程以及invalidate()等相关方法分析

转自:http://blog.csdn.net/yanbober/article/details/46128379/      【工匠若水 http://blog.csdn.net/yanbober】 原本打算自己写的,但是看到这篇文章,觉得写的太好了,,,...
  • TokgoLiang
  • TokgoLiang
  • 2016-01-08 10:18
  • 1444
    关于我
    目前就职于百度
    研究方向:Android,机器学习
    联系方式QQ:2979218500


      欢迎关注微信公众号:DroidMind
      精品内容独家发布平台
      呈现与博客不一样的技术干货
    个人资料
    • 访问:532580次
    • 积分:8435
    • 等级:
    • 排名:第2810名
    • 原创:288篇
    • 转载:48篇
    • 译文:22篇
    • 评论:68条