读书人

android兑现动画效果的方法onDrawFrame

发布时间: 2012-07-01 13:15:00 作者: rapoo

android实现动画效果的方法onDrawFrame
在android中,要实现动画效果,要么通过循环调用canvas.draw系统方法,要么通过调用opengl es中的GLSurfaceView.Renderer实现方法onDrawFrame方法。
canvas画图确实要简单得多,但要实现更好的性能最好还是调用opengl方法,因为它的性能相对来说要好一些。
实现动画的关键就是实现GLSurfaceView.Renderer接口内的方法,最重要的一个就是onDrawFrame,这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,以实现动画效果。因此onDrawFrame的主要作用就是将不同的图片显示出来就可以了。
在此先谈一个额外的话题,那就是怎么去控制onDrawFrame调用的频率,比如1秒钟执行几次?从本人找到的资料看,还没有谁这么做过,细节情况则取决于GLSurfaceView这个类的实现,但这类相当复杂,看了一下没有看懂,最后就放弃了。但我可以知道每秒执行了多少次吧?这个功能可以自己实现,而且还比较简单,先写一个实现类:



然后在onDrawFrame中调用即可。
经过上述操作后就可以在日志文件中查看到每秒钟会执行多少次onDrawFrame方法了。

至于怎么在onDrawFrame方法中实现动画效果这个可能相对来说要麻烦一点,比如拿上一篇博客中的jumper为例,作者自已实现了一个动画类:
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

热点推荐