最近读了 李赞红 的Android自定义组件开发详解,对自定义View和ViewGroup有了更深的理解,现将书中的案例及自己的理解整理出来,进一步加深理解并方便以后回顾,毕竟 好记性不如烂笔头。
先简单介绍下作者,李赞红,在湖南株洲从事IT教育行业,说实话,我刚开始看到这个介绍,还奇怪了,一个培训机构的老师,还能写书(为自己的偏见感到羞愧。。。),进一步了解发现,正是因为作者身在教育行业,才更能体会到程序员们困惑和需求,也更了解这个行业存在的问题,很多程序员工作一段时间后就遇到了职业瓶颈,涉及底层原理很难理解,最终成为无奈的代码搬运工。因此,作者本着发扬java社区一二十年来至死不渝的精神,写下这本书,而我就是这其中的受益者之一。
本篇实现一个小球滚动的效果。
小球就是我们要自定义的view,思路就是要在view的onDraw方法中绘制一个小球,然后通过固定的时间间隔来修改小球的 x 坐标
注意:要保证小球不能滚到屏幕外面去,需要判断小球滚动后 x 坐标是否超出屏幕 左边框 或 右边框
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.e("cyy","onDraw...");
canvas.drawCircle(x,Y,RADIUS,paint);
int width = getMeasuredWidth();
if(x <= RADIUS){
//向右滚动
direction = true;
}
if(x >= width - RADIUS){
//向左滚动
direction = false;
}
x = direction ? x + 5 : x - 5 ; //每绘制一次就将修改小球的 x 坐标
}
现在小球滚动的逻辑有了,接下来就需要定时调用小球的onDraw方法,小球就能真正动起来了。
另起一个Activity文件,设置 开始滚动 和 结束滚动 的按钮来控制小球的滚动。
if(R.id.begin_scroll == id){
//开始滚动
if(mTimer == null){
mTimer = new Timer();
}
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mBallMoveView.postInvalidate();
}
},2000,50);
}else if(R.id.stop_scroll == id){
//停止滚动
if(mTimer != null){
mTimer.cancel();
mTimer = null;
}
}
DONE
此系列后续持续更新。