Android自定义View(二)

要点:

1、自定义View绘制流程

2、绘制随手移动的小球

3、Canvas

4、Paint

5、参考

1、自定义View绘制流程

构造函数

四种重载:

使用:

在activity中:

在layout中:

onMeasure()

测量View大小,View的大小不仅由自身所决定,同时也会受到父控件的影响。

widthMeasureSpec 和 heightMeasureSpec两个 int 类型的参数,是由宽、高和各自方向上对应的测量模式来合成的一个值。getMode():测量模式,getSize():确切数值。

测量模式一共有三种:

UNSPECIFIED:默认值,父控件没有给子view任何限制,子View可以设置为任意大小。

EXACTLY:表示父控件已经确切的指定了子View的大小。

AT_MOST:表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。

onSizeChanged()

在视图大小发生改变时调用。w和h就是View最终的大小。

onLayout()

确定布局的函数,用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数。

在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值。

onDraw()

就是实际绘制内容。

2、绘制随手移动的小球

在现实中要画东西就需要画纸,而要在屏幕上面画东西,则需要Canvas(https://developer.android.google.cn/reference/android/graphics/Canvas.html),也就是画布。

3、Canvas

常用方法如下:

例:

drawColor(int color):设置画布的颜色,如:

canvas.drawColor(Color.GRAY);

drawPaint([Paint paint):画点,如:

drawPoints(float[] pts,Paint paint):画一组点,如:

drawLine(float startX, float startY, float stopX, float stopY, Paint paint):画线,如画一条横线:

drawLines(float[] pts,Paint paint):画一组线,如画两条横线:

drawCircle(float cx, float cy, float radius, Paint paint):画圆,如:

drawRect(float left, float top, float right, float bottom, Paint paint):画距形,如:

drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint):画圆角距形,如:

不过上面这种方法在API21及以上才能使用。如果是API21以下,我们可以使用如下方法:

drawOval(float left, float top, float right, float bottom,Paint paint):画椭圆,如:

不过上面这种方法同画圆角距形一样,在API21及以上才能使用。如果是API21以下,我们可以使用如下方法:

drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint):画圆弧,在API21及以上才能使用,其中startAngle是开始角度、sweepAngle是扫过角度、useCenter是是否使用中心,使用中心绘制出来的图形类似于一个扇形,而设置为false则是圆弧起始点和结束点之间的连线加上圆弧围成的图形。如:

drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint):也是画圆弧,如果是API21以下,我们可以使用以上这种方法,如:

translate(float dx, float dy):位移,translate是坐标系的移动,如果有多个translate(),则是基于当前位置移动,而不是每次都基于屏幕左上角的(0,0)点移动。如下:

scale(float sx, float sy):缩放,缩放的中心默认为坐标原点,而缩放中心轴就是坐标轴,当缩放比例为负数的时候会根据缩放中心轴进行翻转。

scale(float sx, float sy, float px, float py):这个方法可以控制缩放中心的位置,缩放中心就是对应坐标系的原点。如果使用了translate(),坐标系位置发生了改变,则缩放中心的位置是改变后对应的坐标原点,而不是屏幕左上角的(0,0)点。如:

scale是可以叠加的,如下:

rotate(float degrees):以当前坐标原点旋转,跟scale一样有控制中心和可叠加。如:

skew(float sx, float sy):sx是将画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,sy是将画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值。也可以叠加。X = x + sx * y、Y = sy * x + y。如下:

4、Paint

上面简述了Canvas的使用,要想在Canvas上画东西,肯定不能少了Paint,也就是画笔。

常见的使用方法如下:

5、参考

http://www.gcssloop.com/customview/Canvas_BasicGraphics

https://developer.android.google.cn/reference/android/graphics/Canvas.html

https://developer.android.google.cn/reference/android/graphics/Paint.html

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180331G07A8V00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券