给我一岁的儿子写的小游戏
一岁左右的小孩好奇心很强,我在一旁玩手机时我儿子总是要凑过来看一看,看到屏幕上的东西就喜欢去摸一摸,特别是运动的东西更能吸引他的注意。我就突然想到写个小游戏给他玩玩吧。然后就写了一个,不过他并不买账,只玩了一会儿就不玩了。可能是俺的游戏不太符合他的需求吧,嘿嘿。。
虽然这游戏没啥用,但从写程序的角度来说也积累了一点点经验,所以在这里记录一下。说是游戏,其实就是个非常简单的小应用,在屏幕上有个小球,会自动移动,走到头了(四边)就会转向继续移动,一直不停。另外可以用手去拖小球,用手拖的时候小球就跟着手指走,放手了又自己在走。就是这么个简单的画面。
就像这个样子:
下面说一下实现过程:
原理非常简单,就是自定义一个view,画一个小球,用一个线程改变小球的坐标,然后不停地重绘画这个小球,实现小球自动移动。当手指触摸小球时就终止线程,让小球跟着手指走,放手后又用这个线程来控制小球自动移动。
几个注意点:
1、控制小球的移动范围,小球不能移出当前view的范围内,因为draw方法是可以在任何地方画东西的,不管当前view的大小是多大,只是超出了当前view的显示范围就看不见所画的东西,所以手指拖动或自动移动时都要注意不能超出了当前view的区域。
2、当自定义view所在的activity关闭时要停掉控制小球移动的线程,不然会一直运行着。并且下次再打开页面会有多个线程去控制小球。也许还会造成内存泄漏。所以一定要停掉控制线程。
可以重写onDetatchedFromWindow()方法,在该方法内执行停止线程的操作。当关闭view所在的activity时就会调这个方法。
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
isAutoMove = false;
}
3、当自定义view被设置的高宽没有小球那么大的时候,手动去设置适当的高宽以便显示出完整的小球。另外当自定义view放在scrollView中时也要手动设置一下自定义view的高宽。
具体做法如下:
/**
* 调整尺寸
*
* @param measureSpec
* @return
*/
private int fixMeasureSpec(int measureSpec) {
int mode = MeasureSpec.getMode(measureSpec);
if (MeasureSpec.AT_MOST == mode) {
return measureSpec;
} else {
// 如果父控件没有给本控件的高/宽做任何限制
// 或父控件已经确切的指定了本控件的高/宽但高/宽小于小球半径的三倍
// 则手动设置本控件的高/宽为小球半径的三倍
int size = MeasureSpec.getSize(measureSpec);
if (size < 3 * RADIUS) {
size = (int) (3 * RADIUS);
}
return MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST);
}
}
关于MeasureSpec模式:
模式 | 数值 | 描述 |
---|---|---|
UNSPECIFIED | 0 (0x00000000) | 父控件没有给子view任何限制,子View可以设置为任意大小。 |
EXACTLY | 1073741824 (0x40000000) | 表示父控件已经确切的指定了子View的大小。 |
AT_MOST | -2147483648 (0x80000000) | 表示子View具体大小没有尺寸限制,但是存在上限,上限一般为父View大小。 |
MeasureSpec.EXACTLY -表示父控件已经确切的指定了子View的大小。具体的尺寸在size里面。比如子view的宽度设定为android:layout_width=”200dp”。
MeasureSpec.AT_MOST - 表示子View具体大小没有尺寸限制,但是存在上限,上限值在size里面。比如子view的宽度设定为android:layout_width=”wrap_content”, 上限值为父控件的宽度。
MeasureSpec.UNSPECIFIED -父控件没有给子view任何限制,子View可以设置为任意大小。 比如,在ScrollView 中子视图的高度是没有限制的,size的值为0。
最后,上源码:
demo源码:https://github.com/MingHuang1024/FunnyBall
由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享、探讨!
博客:http://blog.csdn.net/MingHuang2017
GitHub:https://github.com/MingHuang1024
Email:MingHuang1024@foxmail.com
微信:724360018