在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相关推荐

  1. android+仿iphone,Android编程实现仿iphone抖动效果的方法(附源码)

    Android编程实现仿iphone抖动效果的方法(附源码) 时间:2021-05-20 本文实例讲述了Android编程实现仿iphone抖动效果的方法.分享给大家供大家参考,具体如下: 布局文件: ...

  2. 自定义控件android特效,Android自定义控件eBook实现翻书效果实例详解

    本文实例讲述了Android自定义控件eBook实现翻书效果的方法.分享给大家供大家参考,具体如下: 效果图: Book.java文件: package com.book; import androi ...

  3. android模糊检索_Android中实现输入框实时模糊搜索效果的方法

    Android中实现输入框实时模糊搜索效果的方法 发布时间:2020-08-13 16:27:11 来源:亿速云 阅读:161 作者:小新 Android中实现输入框实时模糊搜索效果的方法?这个问题可 ...

  4. android 自定义view 动画效果,Android自定义view----音乐播放动画

    先给大家看一下效果,因为我也不知道这个东西具体叫什么,标题上面写的是"音乐播放动画",可能描述的不太准确. 效果图.gif 前言 最近项目中做了一个音频播放的功能,播放条上需要一个 ...

  5. android弹球动画,Android动画之自定义Evaluator实现弹球效果

    前言 今天给大家带来的是自定义Evaluator实现弹球效果,我们先给大家来个效果图. 下面我们介绍具体代码流程 1. 自定义Point类 public class Point { private i ...

  6. android刷新时的圆形动画_Android自定义加载圈动画效果

    本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...

  7. Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.实现百叶窗动画 合理运用图层规则可以实现酷炫的动画效果,比如把图片分割成一条一条,接着每条都逐渐展开,这便产生了百叶窗动画,把图片等分为若干小方格 ...

  8. android ar 动画,Android实现支付宝AR扫描动画效果

    支付宝AR扫描效果动画实现,具体内容如下 之前一个网友说想要一个支付宝扫描动画的效果demo,所以又花了点时间做了下这个东西,先看效果图 说一下实现的思路,如图中最外围的蓝色的是用两个相距180°的圆 ...

  9. android 自定义园动画,Android 自定View实现仿QQ运动步数圆弧及动画效果

    在之前的Android超精准计步器开发-Dylan计步中的首页用到了一个自定义控件,和QQ运动的界面有点类似,还有动画效果,下面就来讲一下这个View是如何绘制的. 1.先看效果图 2.效果图分析 功 ...

最新文章

  1. 机器指令到汇编再到高级编程语言!
  2. python 智能识别 商品_阿里云货架商品识别与管理Python SDK使用示例-阿里云开发者社区...
  3. 利用属性block进行代替代理使得两个viewController传参
  4. hadoop常用命令演示(图片)
  5. mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
  6. Java删除指定值结点[递归]图解
  7. 2021会宁三中高考成绩查询,2020白银中考分数线
  8. linux gdb 寄存器,x86 调试寄存器
  9. 【白话设计模式二十二】解释器模式(Interpreter)
  10. mysql workbench首页_MySQL Workbench是干什么的?
  11. Spire PDF转WORD (高效不失真)
  12. 常用的几种非对称加密算法
  13. 中国传统色的雅称——你可知?
  14. linux ubuntu开放端口查看,ubuntu/linux下查看端口使用情况
  15. 华为智能家居app未能连接上远程云服务_华为云主机远程连接不上 华为云服务登录手机版...
  16. sqlmap用户手册
  17. 【原创】xenomai+linux双内核下的时钟管理机制
  18. Hadoop的序列化和反序列化
  19. 基于Java基础的图书管理系统
  20. java解析html之HTMLparser初次尝试

热门文章

  1. MFC RadioButton
  2. [hiho 18]带修改的RMQ问题
  3. Xsens MTi传感器 ROS下配置
  4. 【CSDN 年终总结】结束与开始,一直在路上—— “1+1=王”的2021总结
  5. JavaScript分割文件(Blob对象|File对象)
  6. 爬取斗图网表情包之后斗图会输?不存在的
  7. goodcrawler的使用说明
  8. 重启vmware中的linux虚拟机后跟windows主机共享的文件失效解决方法
  9. 计算机在法学专业的应用,《大学生就业报告》发布 法学计算机等专业被警告...
  10. 评论:当Google Android 进入中国