简单碰撞算法及其demo(屏幕气泡原理)
2016-05-05 17:28
501 查看
想要做成的效果就是上面的图上的效果,当小球碰到屏幕的边缘的时候,则会改变方向!
原理分析:
原理就是上图描述的那样了.
1速度V0,初始位置和初始角度是需要初始确定的
2根据初始角度和速度V0,计算出在XY轴上的分速度,然后draw完一次就更新一次小球的位置,不停的draw和更新位置
3更新位置后判断此时小球是否到达了X轴,Y轴的边界,如果是则更改在该轴的方向
代码分析:
1.确定初始值
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); top = getTop() + radius + paintWidth/2; left = getLeft() + radius + paintWidth/2; right = getRight() - radius + paintWidth/2; bottom = getBottom() - radius + paintWidth/2; point.set(500, bottom); }
在该demo中,初始速度为XY方向上每次更新变化5个像素,所以默认的角度也就是45°,初始位置在onmeasure中确定了
2,3 更新小球位置并判断小球位置是否到达边界并更新界面
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(point.x, point.y, 30, paint); // 判断x轴方向上的坐标 if (point.x <= left) { isXUp = true; } else if (point.x >= right) { isXUp = false; } // 更新x轴上的位置 if (isXUp) { point.x = point.x + 5; } else { point.x = point.x - 5; } // 判断y轴方向上的坐标 if (point.y <= top) { isYUp = true; } else if (point.y >= bottom) { isYUp = false; } // 更新y轴上的位置 if (isYUp) { point.y = point.y + 5; } else { point.y = point.y - 5; } postInvalidate();//在此处可以使用delay时间来改变更新频率,但是实际使用会有卡顿效果不好 }
通过上面的代码就可以通过不断的刷新界面,完成效果图的碰撞动画了!
源码点击下载
相关文章推荐
- onethink对二维数组结果集进行排序
- mina推送场景小hello world demo
- Spring Security 4 Hibernate整合 注解和xml例子(带源码)
- 数组名及数组名的地址(还有一个小问题没解决)
- MVP+OKHttp 用户登录demo
- 利用redis完成自动补全搜索功能(二)
- APM终端用户体验监控分析(下)
- rsync讲解
- linux I/O模型
- iOS 在价格数字中插入分隔符,逗号,点之类的方法和代码
- Android获取SD卡路径及SDCard内存的方法
- Android自定义View解析之自定义View类型(三)
- 【面试笔试】数据结构与算法
- 第一篇博客
- android开发代码安装app(需要指定路径)
- 使用maven引入Apache poi jar包
- iOS指定位置拉扯图片
- APM终端用户体验监控分析(下)
- 使用Python判断质数(素数)的简单方法讲解
- 龟兔赛跑(hdu2059)