Android怎么实现小球自由碰撞动画
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍"Android怎么实现小球自由碰撞动画",在日常操作中,相信很多人在Android怎么实现小球自由碰撞动画问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年11月22日Android怎么实现小球自由碰撞动画
这篇文章主要介绍"Android怎么实现小球自由碰撞动画",在日常操作中,相信很多人在Android怎么实现小球自由碰撞动画问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Android怎么实现小球自由碰撞动画"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
前言
本文将基于Android对一个小球自由碰撞动画项目做一个简单介绍,并展示部分关键代码以及实际效果动态图
1. add balls List
添加颜色为绿,黄,红,黑,蓝,灰的小球,并设置其大小
ballList.add(new Ball(80, Color.GREEN, 700, width / 2, height / 2)); ballList.add(new Ball(100, Color.YELLOW, 600, width / 4 * 3, height / 4 * 3)); ballList.add(new Ball(120, Color.RED, 800, width / 3 * 3, height / 3 * 3)); ballList.add(new Ball(100, Color.BLACK, 800, width / 3 * 4, height / 3 * 4)); ballList.add(new Ball(120, Color.BLUE, 800, width / 5 * 3, height / 5 * 3)); ballList.add(new Ball(100, Color.DKGRAY, 800, width / 4 * 5, height / 5 * 4));
2.ball parameter
int radius; //半径大小 long speed =-1; //碰撞速度 int color; //颜色 long degree =-1; //初始方向值 int bgAlpha; //透明度 long lifeSpan =-1;
3. 判断是否有发生碰撞的小球
关键代码
private void checkoutBall() { for (int i = 0; i < ballList.size(); i++) { Ball ball1 = ballList.get(i); Ball ball2 = (Ball) distanceMap.get(ball1); if (ball2.getX() == -1 && ball2.getY() == -1) { continue; } int distance2 = Math.abs(ball1.getX() - ball2.getX()) * Math.abs(ball1.getX() - ball2.getX()) + Math.abs(ball1.getY() - ball2.getY()) * Math.abs(ball1.getY() - ball2.getY()); //最小距离小于阈值,发生碰撞 计算碰撞角度 if (distance2 <= (ball1.getRadius() + ball2.getRadius()) * (ball1.getRadius() + ball2.getRadius())) { int x1 = ball1.getX(); int y1 = ball1.getY(); int x2 = ball2.getX(); int y2 = ball2.getY(); //两球的角度差为180 即两球正碰 交换运动方向 if (Math.abs(ball1.getDegree() - ball2.getDegree()) == 180) { int temp = ball1.getDegree(); ball1.setDegree(ball2.getDegree()); ball2.setDegree(temp); } else if (y1 == y2) { //正弦值不存在 角度为90 if (x1 > x2) { ball1.setDegree(90); ball2.setDegree(270); } else { ball1.setDegree(270); ball2.setDegree(90); } } else { //斜碰 两球圆心连接线的角度做反向运动 float tan = (x1 - x2) / (y1 - y2); //正弦对应的角度在[-90,90] 在这取绝对值让角度值为正值 int angle = (int) Math.abs(Math.atan(tan)); if (x1 > x2 && y1 > y2) { //正弦值为正数 角度为[0,90] ball1在右下 ball2在左上 ball1.setDegree(angle + 90); ball2.setDegree(angle + 270); } else if (x1 > x2 && y1 < y2) { //正弦值为负数 角度为[-90,0] ball1在右上 ball2在左下 ball1.setDegree(90 - angle); ball2.setDegree(270 - angle); } else if (x1 < x2 && y1 > y2) { //正弦值为负数 角度为[-90,0] ball1在右下 ball2在左上 ball1.setDegree(270 - angle); ball2.setDegree(90 - angle); } else if (x1 < x2 && y1 < y2) { //正弦值为正数 角度为[0,90] ball1在左上 ball2在右下 ball1.setDegree(angle + 270); ball2.setDegree(angle + 90); } else if (x1 == x1) { //正弦值为0 angle为0 if (y1 > y2) { ball1.setDegree(180); ball2.setDegree(angle); } else { ball1.setDegree(angle); ball2.setDegree(180); } } } //发生碰撞 重新初始化数据 distanceMap.put(ball2, new Ball()); distanceMap.put(ball1, new Ball()); } } }
1.collision detection
2.碰撞后重新调用onDraw(绘制小球)
private class MyThread extends Thread { @Override public void run() { while (true) { actionBall(); postInvalidate(); // 更新界面,重新调用onDraw() try {// sleep(1000 / 36); sleep(10); } catch (Exception e) { e.printStackTrace(); } } } }
onDraw
protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < ballList.size(); i++) { Ball ball = ballList.get(i); Paint paint = new Paint(); paint.setColor(ball.getColor()); paint.setAlpha(ball.getAlpha()); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(1); canvas.drawCircle(ball.getX(), ball.getY(), ball.getRadius(), paint); } }
4.application display
1.静态界面
2.动态效果图
到此,关于"Android怎么实现小球自由碰撞动画"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
碰撞
小球
角度
自由
动画
正弦
学习
代码
关键
动态
大小
效果
更多
界面
负数
颜色
帮助
实用
最小
接下来
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全空间期刊
读取数据库后放缓存
青岛城香果网络技术有限公司
网络安全法实名认证年龄
广东资助申报系统服务器错误
西安小程序开发环境数据库
facebook的服务器
镇江网络安全准入控制系统供应商
2008无法创建数据库
深信上网管理服务器
app注册服务器错误
长生劫单机版连接不上服务器
在数据库管理技术经历了
数据库修改数值类型
网络安全地板
数据库安全参考书
专科生计算机网络技术就业怎么样
js连接数据库access
网络技术安全试题
网络安全自查报告2020年
ctf网络安全大赛一场要多久
导入100w数据到数据库
计算机网络技术朱守业
现货大宗交易软件开发
神武手游服务器等级
软件开发服务行业概况
显卡在软件开发中的作用
app上的数据库
计算机软件开发 与游戏
京隆科技软件开发师