前言:自定义view重要的部分就是view的展示样式,为了实现view的样式可以重写onDraw()方法。
一:Override onDraw()
1.当覆盖了onDraw()方法后,需要一个Canvas变量,就是一个画布,他能画直线等各种形状,还能画bitmap等等。
当使用画布的时候,可以提供一个画笔:Paint。就是设置画出图形的一些特性,如颜色等。
二:创建图形对象
1.在android.graphics中提供了两大类:
1.Canvas:描述画什么。
2.Paint:怎么画。
2.比如,你想用Canvas一线,就可以定义一个Paint来设置这条线的颜色等属性,或是用Canvas画一个矩形的时候,
Paint可以定义一个颜色来填充矩形,或是不填充。
3.在画图形之前,可以定义多个Paint,并放在一个初始化函数中初始化:
4.在画之前初始化这些画笔是很必要的,因为初始化画笔是个很费资源的过程,如果将初始化过程放在了onDraw中,
用户界面就会显得有些呆滞,停顿的感觉。
二:处理layout事件
1.为了能适当的展示你的控件的大小,往往或通过计算屏幕的大小,密度等属性,来设置控件最终显示的大小。切记
千万不要自己以为控件就是那么大,要根据实际情况来设置控件的大小,还有为不同的排列方式,提供不同的布局。
overridden,如果没有特殊的需要,设置控件的大小
overridden中的onSizeChanged();
3.onSizeChanged()方法当,第一次给view赋值的时候,或是任何情况view的大小被改变的时候,都会调用此方法。
计算位置,计算尺寸,都需要在此方法中完成。
4.当设置view的大小的时候,layout manager会默认包含了view的padding值,所以必须控制padding的值,当给
view设置大小的时候:
5.如果你想更好的控制控件的大小,需要实现onMeasure方法,这个方法的两个参数表示父控件希望view的显示大小,
这两个值的大小是硬性标准还是建议值。下面的实例:设置控件的大小以其足够大来容纳内容:
1.设置控件的大小需要考虑padding,正如上文提到过的,这是view的责任。
2.其中的resolveSizeAndState(int,int)方法用于计算view最终显示的大小高度。
其中的View.MeasureSpec有三个常量:
UNSPECIFIED:父控件没有对子view任何限制。
EXACTLY:父控件给了一个适当的大小给子view,当子view设置大小的时候,收到他的束缚。
AT_MOST:尽可能的扩展到指定的大小。
3.这个方法没有返回值,需要在最后强制性的调用setMeasureDimension(w,h)方法,否则在运行时会出现异常。
三:开始画了
1.一旦你完成了初始化工作,定义画笔,确定view的大小,你就可以通过实现onDraw()方法来画控件了。虽然每个控件不同,
但是有一些通用的东西:
drawText()
,通过 setTypeface()设置字体,通过setColor()设置文字的颜色。
2.绘制基本形状:绘制矩形:drawRect(),绘制椭圆:drawOval(),绘制弧线:drawArc()改变是否填充,是否描边等调用 setStyle()。
3.绘制更复杂的图形就需要使用Path类了,可以将多个线条和多个曲线添加到一个Path对象中,然后使用drawPath(),
绘制path对象。通过调用setStyle()来设置填充,描边等属性。
LinearGradient来创建填充渐变对象,然后通过 setShader()将渐变对象设置到形状上。
5.用drawBitmap();对象来绘制图片。