,,前面两篇文章介绍了自定义视图的onMeasure和onLayout原理,本文准备介绍自定义视图的第三个关键部分,即onDraw()函数的重载。
,,对于一个自定义观点来说,onMeasure只是用来计算角度尺寸,onDraw()才是真正执行视图的绘制,所以一般我们都需要重写onDraw()函数来绘制我们期望的UI界面。下面我以一个具体的例子探索自定义视图的onDraw()的实现过程和关键点。
,,我们的目标是制作一个柱状图动画,视图的动画启动后,会显示一排柱状图增长的画面,这种动画多用于财务类或者统计类的应用程序中,效果如图所示():
,,, public class AnimatorView extends View { ,,,private Paint mPaint;,,, ,,,, ,,,public AnimatorView (Context 上下文),{ ,,,,,,,超级(上下文),, ,,,,,,,初始化(); ,,,} ,,,public AnimatorView (Context 上下文,AttributeSet attrs), { ,,,,,,,超级(上下文,attrs); ,,,,,,,初始化(); ,,,} ,,,, ,,,public AnimatorView (Context 上下文,AttributeSet attrs,, int defStyle), { ,,,,,,,超级(上下文,attrs, defStyle); ,,,,,,,初始化(); ,,,} ,,,, ,,,protected void 初始化(),{ ,,,,,,,mPaint =, new 油漆(),, ,,,,,,,mPaint.setAntiAlias(真正的); ,,,,,,,mPaint.setStyle (Style.FILL);,,,,,,,,,,,,,, ,,,},,, }
,,注:涂料是用来绘图的画笔,可以设置其样式,画面的粗细,填充模式,颜色等等。
,,<强> 2。定义待绘制的图形数据强>
,,待绘制的图形数据一般是在程序中动态给出的,这里为了演示,直接定义好:
public class AnimatorView extends View { ,,,private static final int RECT_WIDTH =, 60岁,,,,,//每个矩形块的宽度 ,,,private static final int RECT_DISTANCE =, 40,,//矩形块之间的间距 ,,,private static final int TOTAL_PAINT_TIMES =, 100,,//控制绘制速度,分100次完成绘制,,,, ,,,//待绘制的矩形块矩阵,左为高度,右为颜色 ,,,private static final int [] [], RECT_ARRAY =, {, ,,,,,,,{380 Color.GRAY}, ,,,,,,,{600 Color.YELLOW}, ,,,,,,,{200 Color.GREEN}, ,,,,,,,{450 Color.RED}, ,,,,,,,{300 Color.BLUE} ,,,},, ,,,, ,,,private int mPaintTimes =, 0;,,//当前已经绘制的次数 }
,,<强> 3。重载onDraw()函数,实现绘制强>
<强>
强>
public class AnimatorView extends View { ,,@Override ,,,protected void onDraw (Canvas 画布),{ ,,,,,,,mPaintTimes + +; ,,,,,,, ,,,,,,,,(,int i=0, iAndroid开发实践:自定义带动画的观点