在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开发中,帧动画是一种常见的动画形式,用于创建连续播放的一系列图像,给人以动态效果。当处理大量或大尺寸图片时,常规的AnimationDrawable可能会导致内存溢出,这时可以考虑使用OpenGL ES (GLS)来实现帧...
本文将深入探讨如何利用Android的Camera类来实现3D动画效果。 Android 3D动画主要依赖于OpenGL ES(OpenGL for Embedded Systems)库,这是一个用于2D和3D图形渲染的API。在Android中,我们可以使用OpenGL ES 1.x或...
综上所述,实现Android平台上的3D翻页效果是一个综合了3D图形学、动画编程和用户交互的挑战。通过熟练掌握OpenGL ES和Android的图形API,开发者可以创建出富有视觉吸引力且交互性强的应用,为用户提供独特的用户体验...
"ANDROID系统3D翻页效果源代码"提供了一种实现这一效果的方法。接下来,我们将详细讨论这个主题。 首先,3D翻页效果的核心在于视差滚动和空间变换。这种效果通常通过OpenGL ES或者Android的硬件加速Canvas来实现,...
在这个接口中,我们需要重写onDrawFrame()方法来绘制每一帧的翻页效果。 2. **模型和矩阵**: 在3D空间中,定义书页的几何模型,如矩形或梯形,然后使用变换矩阵进行旋转、平移和缩放,模拟翻页的动作。 3. **纹理...
在Android开发中,实现各种动画效果是提升用户体验的重要手段之一,尤其像桌面旋转这样的动态效果,可以给用户带来视觉上的新鲜感。这个“Android旋转效果源码”项目显然是专注于实现类似OpenGL的3D旋转效果,使得...
代码中应有对`onDrawFrame()`方法的实现,该方法在每一帧时调用,更新3D模型的状态,并通过`glDrawArrays()`或`glDrawElements()`绘制。 在学习和实践中,了解并掌握以上知识点,将有助于你创建出引人入胜的Android...
通过`GLSurfaceView`,开发者可以创建自己的渲染管线,实现复杂的图像处理和动画效果。 在摄像头预览中,`Camera`类用于控制摄像头硬件,可以设置参数、开始预览、拍照等。当与`GLSurfaceView`结合时,通常会将`...
在给定的“Android Service 显示动画的demo”中,我们看到开发者利用Service结合GLSurfaceView来实现在桌面绘制一个立方体的3D动画效果。这种技术可以用于创建沉浸式通知、桌面小部件或者其他需要在后台持续运行的...
这个"安卓Android源码——火焰效果简单源码.zip"文件提供了一个简单的实现火焰动画的示例,帮助开发者理解如何在Android应用中创建逼真的火焰动态效果。 首先,我们要了解火焰效果的实现通常基于图形渲染技术,比如...
总结来说,实现歌词逐字同步的线性渲染效果,需要结合Android的图形渲染API、Shader编程以及动画系统。理解并熟练掌握这些知识,将使你能够在Android应用中创造出更多创新和富有表现力的视觉效果。在实际项目中,还...
4. 渲染循环:在Android中,通常在SurfaceView的onDrawFrame方法中实现,不断更新和绘制3D场景。 二、Android内置3D库 1. Android Framework提供的View类:例如,ViewFlipper、Gallery等,虽然它们不是严格的3D...
同时,我们需要在`onDrawFrame()`方法中处理图像的更新和动画效果。 接下来,我们要实现手势操作来控制图片轮播。Android提供了`GestureDetector`和`ScaleGestureDetector`类,它们可以帮助我们识别滑动、点击和...
同时,你需要实现自定义的`Renderer`来绘制粒子,这可能包括在`onDrawFrame`方法中调用`drawParticles`。 6. **性能优化**:由于粒子系统的计算密集型,优化性能是必要的。你可以通过减少粒子数量、使用固定步长的`...
3. 渲染循环:在onSurfaceCreated和onDrawFrame方法中实现,确保图形的连续更新。 4. 视图和投影变换:调整视角,将3D空间中的物体映射到2D屏幕上。 三、Android 3D库和工具 1. Sceneform:Google推出的库,简化了...
- **动画循环**: 通过不断调用onDrawFrame方法实现动画效果。 综上所述,《Android入门到精通》这本书全面介绍了Android系统的各个方面,从系统结构、SDK使用到应用程序的开发和UI实现,再到2D/3D图形编程,为初学...
这一效果主要通过OpenGL ES或Android的内置动画框架实现,使得视图能够进行三维空间中的旋转,给人一种物体翻转的视觉体验。下面我们将深入探讨如何在Android中实现3D反转效果。 首先,Android提供了一个名为`...
为了实现风车效果,我们需要创建一个自定义的`SurfaceView`子类,并重写其中的关键方法,如`onCreateSurfaceHolder()`和`onDrawFrame()`。 1. **初始化与配置**: - 在`onCreate()`方法中,我们实例化`SurfaceView...
在Android中,你可能需要创建一个`GLSurfaceView`来作为OpenGL ES的画布,并实现`GLSurfaceView.Renderer`接口,其中包含`onDrawFrame()`方法用于渲染每一帧。`Elasticsearch`标签可能指的是在处理大量数据时,如何...
源码中可能还包括自定义的视图布局和动画,比如使用CardView或SurfaceView来构建3D播放界面,以及利用ObjectAnimator或ValueAnimator实现平滑的3D转换效果。同时,3D渲染可能需要用到矩阵运算,包括投影变换、视图...