android ondraw动画,android实现动画效果的方法onDrawFrame
在android中,要实现动画效果,要么通过循环调用canvas.draw系统方法,要么通过调用opengl es中的GLSurfaceView.Renderer实现方法onDrawFrame方法。
canvas画图确实要简单得多,但要实现更好的性能最好还是调用opengl方法,因为它的性能相对来说要好一些。
实现动画的关键就是实现GLSurfaceView.Renderer接口内的方法,最重要的一个就是onDrawFrame,这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,以实现动画效果。因此onDrawFrame的主要作用就是将不同的图片显示出来就可以了。
在此先谈一个额外的话题,那就是怎么去控制onDrawFrame调用的频率,比如1秒钟执行几次?从本人找到的资料看,还没有谁这么做过,细节情况则取决于GLSurfaceView这个类的实现,但这类相当复杂,看了一下没有看懂,最后就放弃了。但我可以知道每秒执行了多少次吧?这个功能可以自己实现,而且还比较简单,先写一个实现类:
public class FPSCounter {
long startTime = System.nanoTime();
int frames = 0;
/**
* 计算每秒执行了多少次
*/
public void logFrame() {
frames++;
if(System.nanoTime() - startTime >= 1000000000) {
Log.d("FPSCounter", "fps: " + frames);
frames = 0;
startTime = System.nanoTime();
}
}
}
然后在onDrawFrame中调用即可。
经过上述操作后就可以在日志文件中查看到每秒钟会执行多少次onDrawFrame方法了。
至于怎么在onDrawFrame方法中实现动画效果这个可能相对来说要麻烦一点,比如拿上一篇博客中的jumper为例,作者自已实现了一个动画类:
public class Animation {
public static final int ANIMATION_LOOPING = 0;
public static final int ANIMATION_NONLOOPING = 1;
final TextureRegion[] keyFrames;
final float frameDuration;
public Animation(float frameDuration, TextureRegion ... keyFrames) {
this.frameDuration = frameDuration;
this.keyFrames = keyFrames;
}
public TextureRegion getKeyFrame(float stateTime, int mode) {
int frameNumber = (int)(stateTime / frameDuration);
if(mode == ANIMATION_NONLOOPING) {
frameNumber = Math.min(keyFrames.length-1, frameNumber);
} else {
frameNumber = frameNumber % keyFrames.length;
}
return keyFrames[frameNumber];
}
}
这个类中有两个主要的参数,keyFrames用于存储动画播放的连续图片,而frameDuration则用于图片更新的时间间隔。而getKeyFrame则根据不同的时间取出不同的图片,然后onDrawFrame调用getKeyFrame方法获得图片将其画出,这样就实现了游戏的单个角色的动画效果。具体实现可见上一篇博客中的jumper代码。
游戏确实是一张一张图画上去的,但要通过opengl来画,却还有些规则,这也是opengl难用的主要原因-----规则太多。举个简单点的例子,如高分排行榜,除了先画个游戏背景外,还得在背景下画些数字出来,则就会用到两种不同的显示设置:
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
guiCam.setViewportAndMatrices();
gl.glEnable(GL10.GL_TEXTURE_2D);
batcher.beginBatch(Assets.background);
batcher.drawSprite(160, 240, 320, 480, Assets.backgroundRegion);
batcher.endBatch();
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
batcher.beginBatch(Assets.items);
batcher.drawSprite(160, 360, 300, 33, Assets.highScoresRegion);
float y = 240;
for(int i = 4; i >= 0; i--) {
Assets.font.drawText(batcher, highScores[i], xOffset, y);
y += Assets.font.glyphHeight;
}
batcher.drawSprite(32, 32, 64, 64, Assets.arrow);
batcher.endBatch();
gl.glDisable(GL10.GL_BLEND);
}
可以看到,画背景时使用的是GL10.GL_TEXTURE_2D模式,而在背景上画文字或角色时使用融合模式GL10.GL_BLEND。
关于游戏画面及动画的主要部分就是这些了,opengl 里面的需要注意的东西还很多,以后有时间的话再讲讲其它方面的。
android ondraw动画,android实现动画效果的方法onDrawFrame相关推荐
- android+仿iphone,Android编程实现仿iphone抖动效果的方法(附源码)
Android编程实现仿iphone抖动效果的方法(附源码) 时间:2021-05-20 本文实例讲述了Android编程实现仿iphone抖动效果的方法.分享给大家供大家参考,具体如下: 布局文件: ...
- 自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解
本文实例讲述了Android自定义控件eBook实现翻书效果的方法.分享给大家供大家参考,具体如下: 效果图: Book.java文件: package com.book; import androi ...
- android模糊检索_Android中实现输入框实时模糊搜索效果的方法
Android中实现输入框实时模糊搜索效果的方法 发布时间:2020-08-13 16:27:11 来源:亿速云 阅读:161 作者:小新 Android中实现输入框实时模糊搜索效果的方法?这个问题可 ...
- android 自定义view 动画效果,Android自定义view----音乐播放动画
先给大家看一下效果,因为我也不知道这个东西具体叫什么,标题上面写的是"音乐播放动画",可能描述的不太准确. 效果图.gif 前言 最近项目中做了一个音频播放的功能,播放条上需要一个 ...
- android弹球动画,Android动画之自定义Evaluator实现弹球效果
前言 今天给大家带来的是自定义Evaluator实现弹球效果,我们先给大家来个效果图. 下面我们介绍具体代码流程 1. 自定义Point类 public class Point { private i ...
- android刷新时的圆形动画_Android自定义加载圈动画效果
本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...
- Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)
需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.实现百叶窗动画 合理运用图层规则可以实现酷炫的动画效果,比如把图片分割成一条一条,接着每条都逐渐展开,这便产生了百叶窗动画,把图片等分为若干小方格 ...
- android ar 动画,Android实现支付宝AR扫描动画效果
支付宝AR扫描效果动画实现,具体内容如下 之前一个网友说想要一个支付宝扫描动画的效果demo,所以又花了点时间做了下这个东西,先看效果图 说一下实现的思路,如图中最外围的蓝色的是用两个相距180°的圆 ...
- android 自定义园动画,Android 自定View实现仿QQ运动步数圆弧及动画效果
在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的. 1.先看效果图 2.效果图分析 功 ...
最新文章
- 机器指令到汇编再到高级编程语言!
- python 智能识别 商品_阿里云货架商品识别与管理Python SDK使用示例-阿里云开发者社区...
- 利用属性block进行代替代理使得两个viewController传参
- hadoop常用命令演示(图片)
- mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
- Java删除指定值结点[递归]图解
- 2021会宁三中高考成绩查询,2020白银中考分数线
- linux gdb 寄存器,x86 调试寄存器
- 【白话设计模式二十二】解释器模式(Interpreter)
- mysql workbench首页_MySQL Workbench是干什么的?
- Spire PDF转WORD (高效不失真)
- 常用的几种非对称加密算法
- 中国传统色的雅称——你可知?
- linux ubuntu开放端口查看,ubuntu/linux下查看端口使用情况
- 华为智能家居app未能连接上远程云服务_华为云主机远程连接不上 华为云服务登录手机版...
- sqlmap用户手册
- 【原创】xenomai+linux双内核下的时钟管理机制
- Hadoop的序列化和反序列化
- 基于Java基础的图书管理系统
- java解析html之HTMLparser初次尝试
热门文章
- MFC RadioButton
- [hiho 18]带修改的RMQ问题
- Xsens MTi传感器 ROS下配置
- 【CSDN 年终总结】结束与开始,一直在路上—— “1+1=王”的2021总结
- JavaScript分割文件(Blob对象|File对象)
- 爬取斗图网表情包之后斗图会输?不存在的
- goodcrawler的使用说明
- 重启vmware中的linux虚拟机后跟windows主机共享的文件失效解决方法
- 计算机在法学专业的应用,《大学生就业报告》发布 法学计算机等专业被警告...
- 评论:当Google Android 进入中国