Android中View绘图总结

原创 2016年06月02日 09:45:18

在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动效开篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Android画图最基本的三个对象(Color,Paint,Canvas)

简述: Android画图最基本的三个对象(Color,Paint,Canvas) 三个类都存放在 android.graphics包下 1) Color :颜色对象,相当于现实生活中的 ‘...

一个绚丽的loading动效分析与实现!

前两天我们这边的头儿给我说,有个 gif 动效很不错,可以考虑用来做项目里的loading,问我能不能实现,看了下效果确实不错,也还比较有新意,复杂度也不是非常高,所以就花时间给做了,我们先一起看下效...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Path特效之PathMeasure打造万能路径动效

如果对这个桃心绘制有问题或有兴趣的同学,可以链接到 Path相关方法讲解(二),此时我们的需求是这样的: 假定我们现在是一个婚恋产品,有一个“心动”的功能,用户点击“心动”按钮的时候,有一个光点快速的...

android动效开篇

在现在的Android App开发中,动效越来越受到产品和设计师同学的重视,如此一来,也就增大了对开发同学的考验,虽说简单的动效:如移动,旋转,缩放,渐变或普通的界面跳转相对简单,但在目前日益激烈的竞...

Android入门第十四篇之画图

Android入门第十四篇之画图

Android Studio中Xml的新建及shape绘图

点击New–>Drawable resource file–>选择需要新建的xml类型,默认新建的是selector文件,只需将selector更换为shape,并在头标签中添加Android:sha...

Android Canvas绘图详解(图文)

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android中使用图形处理引擎...

贝塞尔曲线开发的艺术

贝塞尔曲线开发的艺术 一句话概括贝塞尔曲线:将任意一条曲线转化为精确的数学公式。 很多绘图工具中的钢笔工具,就是典型的贝塞尔曲线的应用,这里的一个网站可以在线模拟钢笔工具的使用: http://...

机器学习算法汇总:人工神经网络、深度学习及其它

机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的。这里,我们从两个方面来给大家介绍,第一个方面是学习的方式,第二个方面是算法的类似性。本文来自IT经理...
  • jdbc
  • jdbc
  • 2016-01-25 13:24
  • 1310

丰富你的程序,运用手机多媒体

在过去,手机的功能都比较单调,仅仅就是用来打电话和发短信的。而如今,手机在我们生活中正扮演着越来越重要的角色,各种娱乐方式都可以在手机上进行。上班的路上太无聊,可以带着耳机听音乐。外出旅行的时候,可以...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)