给我一岁的儿子写的小游戏

给我一岁的儿子写的小游戏

一岁左右的小孩好奇心很强,我在一旁玩手机时我儿子总是要凑过来看一看,看到屏幕上的东西就喜欢去摸一摸,特别是运动的东西更能吸引他的注意。我就突然想到写个小游戏给他玩玩吧。然后就写了一个,不过他并不买账,只玩了一会儿就不玩了。可能是俺的游戏不太符合他的需求吧,嘿嘿。。

虽然这游戏没啥用,但从写程序的角度来说也积累了一点点经验,所以在这里记录一下。说是游戏,其实就是个非常简单的小应用,在屏幕上有个小球,会自动移动,走到头了(四边)就会转向继续移动,一直不停。另外可以用手去拖小球,用手拖的时候小球就跟着手指走,放手了又自己在走。就是这么个简单的画面。

就像这个样子:

下面说一下实现过程:

原理非常简单,就是自定义一个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模式:
模式数值描述
UNSPECIFIED0 (0x00000000)父控件没有给子view任何限制,子View可以设置为任意大小。
EXACTLY1073741824 (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值