要点:
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
领取专属 10元无门槛券
私享最新 技术干货