第五章android游戏开发.ppt

上传人:本田雅阁 文档编号:2561089 上传时间:2019-04-08 格式:PPT 页数:77 大小:1.42MB
返回 下载 相关 举报
第五章android游戏开发.ppt_第1页
第1页 / 共77页
第五章android游戏开发.ppt_第2页
第2页 / 共77页
第五章android游戏开发.ppt_第3页
第3页 / 共77页
亲,该文档总共77页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第五章android游戏开发.ppt》由会员分享,可在线阅读,更多相关《第五章android游戏开发.ppt(77页珍藏版)》请在三一文库上搜索。

1、第五章 android游戏开发,本章的主要内容: 5.1、android游戏开发框架 5.2、Graphics类开发 5.3、动画实现 5.4、小结,5.1 View类开发框架,View这个类是描绘块状视图的基类。View会绘制一个包含的Drawing是event事件的方形块,是所有与用户交互的组件的Widgets的基类(Buttons,textField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。,游戏最重要的是与玩家交互,比如键盘输入、触笔点击等事件。android中提供了 onKeyUp

2、、onKeyDown、onKeyMultiple、onKeyPreIme、onTouchEvent、onTrackballEvent等方法,可以轻松地处理游戏中的时间消息。所以在继承View时,需要重载这几个方法,当有按键按下或弹起的时候,会自动调用方法来处理。,游戏的核心是不断地绘图和刷新界面,图我们可以通过onDraw方法绘制。android中提供了invalidate方法实现界面的刷新。 注意:invalidate不能直接在线程中调用,他违背了单线程模型。UI操作并不是线程安全的,这些操作必须在UI线程中执行。android中最常用的方法是利用Handler来实现UI的更新。,实例演示,

3、下面通过实现一个在屏幕上不停变换颜色的矩形来分析android的界面更新。该实例中,我们通过Handler对象并重写了handleMessage方法实现一个消息的接收器,然后在线程中通过sendMessage()方法发送更新界面信息,当接收器收到更新界面的信息时 ,便执行Invalidate方法 实现更新在屏幕上显示。(Example_05_1),运行结果如下,5.1.2 SurfaceView类开发框架,上一节讲解了View类的游戏开发框架,当需要开发复杂的游戏的时候,对程序的执行效率要求很高时,这时必须使用SurfaceView类进行开发。例如对于速度很高的游戏可以使用双缓冲技术来显示。游

4、戏中的人物、背景、动画等都需要画在一个画布上,而SurfaceView可以直接访问这个画布。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。,android图形系统一个重要的概念是surface 、View 及其子类要画在画布上,每一个Surface创建一个Canvas对象。来管理View在Surface上的绘图操作。 在使用SurfaceView开发时需要注意的是,使用它绘图时,一般都是出现在最顶层。使用时还需要对其进行创建、销毁,情况改变时进行监视,这就要实现SurfaceHolder.Callback接口,如果要对被绘制的画布进行裁剪,控制其大小时都需要使用S

5、urfaceHolder来完成处理。在程序中,SurfaceHolder对象需要通过getHolder方法来获得,同时还需要addCallback方法来添加“回调函数”。,SurfaceView和View的明显不同之处在于,SurfaceView不需要通过线程来更新视图,但在绘制之前必须使用lockCanvas方法锁定画布,并得到画布,然后在画布上绘制;当绘制完成后,使用unlockCanvasAndPost方法来解锁画布,于是才能显示在屏幕之上。SurfaceView类的事件处理则和View一样。,实例演示,本例通过SurfaceView类实现一个游戏框架,该实例绘制了一个不断变换颜色的圆,

6、并且实现了SurfaceView的事件处理。我们按上下键时,图形可以移动。其控制整个应用流程的Activity类与上一节差不多。 下面是运行结果演示(具体代码见书本P115)。,运行结果展示,5.2 Graphics 类开发,前面我们已经分析了android中游戏开发中常用的两个视图类的开发框架,下面学习如何使用android中的Graphics类绘制图形。 要开发游戏,必须会在屏幕上绘制2D图形,在android中需要通过Graphics类来显示2D图形。Graphics类包含了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)、2D几何图形等常用类。,5.2

7、.1 Paint和Color类简介,要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下:,etAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色 setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸。 setStyle: 设置画笔风格,空心或者实心。 setStrokeWidth: 设置空心的边框宽度。 getColor: 得到画笔的颜色 getAlpha:

8、 得到画笔的Alpha值。,Color类更加简单,主要定义了一些颜色常量,以及对颜色的转换等。主要的十二种颜色如下:,Color类还提供了Color.rgb的方法将整形的颜色转换成Color类型,如Color.red方法可以提取红色的值。下面我们来看一个实例,分别说明这些方法的使用,运行效果如后图所示。(具体代码见书P119),代码演示: package com.yarin.android.Examples_05_03; /导入的包略,详见源代码 public class GameView extends View implements Runnable public final static

9、 String TAG = “Examples_05_03_GameView“; / /* 声明Paint对象 */ private Paint mPaint = null; public GameView(Context context) super(context); /* 构建对象 */ mPaint = new Paint(); /* 开启线程 */ new Thread(this).start(); ,public void onDraw(Canvas canvas) super.onDraw(canvas); /* 设置Paint为无锯齿 */ mPaint.setAntiAlia

10、s(true); /* 设置Paint的颜色 */ mPaint.setColor(Color.RED); mPaint.setColor(Color.BLUE); mPaint.setColor(Color.YELLOW); mPaint.setColor(Color.GREEN); /* 同样是设置颜色 */ mPaint.setColor(Color.rgb(255, 0, 0); /* 提取颜色 */ Color.red(0xcccccc); Color.green(0xcccccc); /* 设置paint的颜色和Alpha值(a,r,g,b) */ mPaint.setARGB(2

11、55, 255, 0, 0); /* 设置paint的Alpha值 */ mPaint.setAlpha(220);,mPaint.setTextSize(14); / 设置paint的风格为“空心”. / 当然也可以设置为“实心”(Paint.Style.FILL) mPaint.setStyle(Paint.Style.STROKE); / 设置“空心”的外框的宽度。 mPaint.setStrokeWidth(5); /* 得到Paint的一些属性 */ Log.i(TAG, “paint的颜色:“ + mPaint.getColor(); Log.i(TAG, “paint的Alpha

12、:“ + mPaint.getAlpha(); Log.i(TAG, “paint的外框的宽度:“ + mPaint.getStrokeWidth(); Log.i(TAG, “paint的字体尺寸:“ + mPaint.getTextSize(); /* 绘制一个矩形 */ / 肯定是一个空心的举行 canvas.drawRect(320 - 80) / 2, 20, (320 - 80) / 2 + 80, 20 + 40, mPaint);,mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.GREEN); /* 绘制绿色实心

13、矩形 */ canvas.drawRect(0, 20, 40, 20 + 40, mPaint); / 触笔事件 public boolean onTouchEvent(MotionEvent event) return true; / 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) return true; / 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) return false; public boolean onKeyMultiple(in

14、t keyCode, int repeatCount, KeyEvent event) return true; ,public void run() while (!Thread.currentThread().isInterrupted() try Thread.sleep(100); catch (InterruptedException e) Thread.currentThread().interrupt(); / 使用postInvalidate可以直接在线程中更新面 postInvalidate(); ,测试结果演示,5.2.2 Canvas 类介绍,当我们调整好画笔之后,现在需

15、要绘制到画布上,这就得用Canvas类了。在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。 下面来分析Android中Canvas有哪些功能,Canvas提供了如下一些方法:,Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。 Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。 Canvas(GL gl): 在绘制3D效果时使用,与OpenGL

16、相关。 drawColor: 设置Canvas的背景颜色。 setBitmap: 设置具体画布。 clipRect: 设置显示区域,即设置裁剪区。 isOpaque:检测是否支持透明。 rotate: 旋转画布 setViewport: 设置画布中显示窗口。 skew: 设置偏移量。,上面列举了几个常用的方法。在游戏开发中,我们可能需要对某个精灵执行旋转、缩放和一些其它操作。我们可以通过旋转画布来实现,但是旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save 方法来锁定需要操作的对象,在操作之后通过 restore 方法来解除锁定。,我们对左边的矩形执行了旋转

17、操作,而没有旋转右边的矩形,由于我们设置了裁剪区域,因此左边的矩形只能看到一部分,下面让我们来看看代码 这里我只贴出了我们自己的 View类 GameView, Activity类不贴出了 就在里边 new 一个GameView类 然后设置布局 然后main.xml也不贴出来了 因为它根本就没用到。,代码展示,package com.yarin.android.Examples_05_04; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import

18、android.graphics.Paint; import android.graphics.Rect; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class GameView extends View implements Runnable /* 声明Paint对象 */ private Paint mPaint = null; public GameView(Context context) super(context); /* 构建对象

19、*/ mPaint = new Paint(); /* 开启线程 */ new Thread(this).start(); ,public void onDraw(Canvas canvas) super.onDraw(canvas); /* 设置画布的颜色 */ canvas.drawColor(Color.BLACK); /* 设置取消锯齿效果 */ mPaint.setAntiAlias(true); /* 设置裁剪区域 */ canvas.clipRect(10, 10, 280, 260); /* 线锁定画布 */ canvas.save(); /* 旋转画布 */ canvas.r

20、otate(45.0f); /* 设置颜色及绘制矩形 */ mPaint.setColor(Color.RED); canvas.drawRect(new Rect(15,15,140,70), mPaint); /* 解除画布的锁定 */ canvas.restore(); /* 设置颜色及绘制另一个矩形 */ mPaint.setColor(Color.GREEN); canvas.drawRect(new Rect(150,75,260,120), mPaint); ,/ 触笔事件 public boolean onTouchEvent(MotionEvent event) return

21、 true; / 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) return true; / 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) return false; public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) return true; ,public void run() while (!Thread.currentThread().isIn

22、terrupted() try Thread.sleep(100); catch (InterruptedException e) Thread.currentThread().interrupt(); / 使用postInvalidate可以直接在线程中更新界面 postInvalidate(); ,运行结果展示,5.2.3几何图形绘制,前面讲到的是画一般都是一些矩形,今天就看看怎么在android手机屏幕上绘制一些几何图形,如三角形、多边形、椭圆、圆形、正方形 等等。并且设置 空心、实心。下面我们先来看看 在android中可以绘制出那些几何图形 。,android 中可以绘制的几何图形,

23、方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形 drawLine 绘制直线 drawPoin 绘制点,下面通过一个例子来看看如何绘制这些图形,运行结果如下。完整代码请参见本书P123,实例中分别绘制了空心和实心的几何图形。,5.2.4 字符串的绘制,在游戏开发中,我们不可能全部用图片来显示,很多时候需要绘制字符串,比如开发一个RPG游戏,有大量的对话内容,这时如果全部用图片来显示肯定不行。下面我们就看看如果在Canvas 画布中绘制字符串。,android中提供了一系列的drawText方法来绘制字符串,在绘

24、制字符串之前需要设置画笔对象,包括字符串的尺寸、颜色等属性。使用FontMetrics 来规划字体的属性,可以通过getFontMetrics 方法来获得系统字体的相关内容。下面来看一个大量文本自动换行、翻页和示例是如何操作字符串的,运行效果 见下图:,当我们按下方向键时就会换到下一行字体 上方向键换到上一行字体。下面我们列出在字符串处理时常用的方法: setTextSize: 设置字符串的尺寸 setARGB: 设置颜色(ARGB) getTextWidths: 取得字符串的宽度 setFlags (Paint.ANTI_ALIAS_FLAG): 消除锯齿。 由于这个示例的代码 比较长 ,在

25、这里 就不贴出来了,有时间并且感兴趣的没有可以看书本源码研究。,5.2.5 图像绘制,在android中,项目目录下“resdrawable”用来放置一些该项目的图片资源,那么如何显示这些图片资源呢,android中提供了Bitmap来存放这些资源,如下代码可以通过一个资源索引来得到其图像对象Bitmap。 ((BitmapDrawable)getResourses().getDrawable(资源索引).getBitmap(),Bitmap 还提供了一些方法,比如getHeight方法和getWidth方法可以获得这些图像的高度和宽度,我们将在下面的实例中分析如何使用这些方法,并将图像显示在

26、屏幕上,运行效果如下图所示,完整代码见书本P127.,5.2.6 图像旋转,在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配。Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现。,首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:,在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图。,解

27、释一下,上面的 sinX 和 cosX ,表示旋转角度的 cos 值和 sin 值,注意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2,这样子。,Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。set是直接设置Matrix的值,每次set一次,整个Matrix的

28、数组都会变掉。 我们现在通过setRotate设置旋转角度,用creatBitmap创建一个经过旋转等处理的Bitmap对象,然后将Bitmap绘制到屏幕之上,于是就实现了旋转操作。,运行结果展示如下,5.2.7 图像的缩放,前面发过一篇如何利用Matrix来旋转图像,那么如何来缩放图像呢?其实旋转和缩放一样,不同的是需要使用Matrix 和 postScale 方法来设置图像缩放的倍数。下面的示例可以通过上下键来缩放和放大图像。 至于怎么旋转图像 大家请看书上例子 ,当然我们需要先看运行效果。,缩放效果展示,5.2.8 图像像素操作,在我们玩的游戏中我们会经常见到一些图像的特效,比如半透明等

29、效果。要实现这种半透明效果其实并不难,需要我们懂得图像像素的操作。不要怕,其实在Android中Bitmap为我们提供了操作像素的基本方法。 我们可以通过getPixels()方法获得该图像的像素并放到一个数组中去,我们操作这个数组就可以了。最后通过setPixels()方法设置这个数组到Bitmap中。,在Android中,每一个图像像素通过一个4字节整数来展现:最高位字节用作Alpha通道,即用来实现透明与不透明控制,255代表完全不透明,0则代表完全透明;接下来的一个字节是Red红色通道,255代表完全是红包。依次类推,接下来的两个字节相应地实现绿色和蓝色通道。,5.2.9 Shader

30、类介绍,Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用。,Shader类的使用,都需要先构建Shader对象,然后通过Paint的

31、setShader方法设置渲染对象,然后设置渲染对象,然后再绘制时使用这个Paint对象即可。当然,用不同的渲染时需要构建不同的对象。 下面是一个简单的示例,其实用起来比较简单了 只是方法参数比较多。但是还比较容易理解。大家可以去翻翻API 这里就不深入讨论了,以后用到再说吧。,运行效果展示,5.2.10 双缓冲技术,Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。为了更容易的了解双缓冲技术,下面介绍用View实现双缓冲的方法。,先概述一下,双缓冲的核心技术

32、就是先通过setBitmap方法将要绘制的所有的图形会知道一个Bitmap上,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。具体的实现代码如下:,package com.yarin.android.Examples_05_12; import android.content.Context; public class GameView extends View implements Runnable /* 声明Bitmap对象 */ Bitmap mBitQQ = null; Paint mPaint = null; /* 创建一个缓冲区 */ Bitmap mSC

33、Bitmap = null; /* 创建Canvas对象 */ Canvas mCanvas = null; public GameView(Context context) super(context); /* 装载资源 */ mBitQQ = (BitmapDrawable) getResources().getDrawable(R.drawable.qq).getBitmap(); /* 创建屏幕大小的缓冲区 */ mSCBitmap=Bitmap.createBitmap(320, 480, Config.ARGB_8888); /* 创建Canvas */ mCanvas = new

34、 Canvas(); /* 设置将内容绘制在mSCBitmap上 */ mCanvas.setBitmap(mSCBitmap); mPaint = new Paint(); /* 将mBitQQ绘制到mSCBitmap上 */ mCanvas.drawBitmap(mBitQQ, 0, 0, mPaint); /* 开启线程 */ new Thread(this).start(); ,public void onDraw(Canvas canvas) super.onDraw(canvas); /* 将mSCBitmap显示到屏幕上 */ canvas.drawBitmap(mSCBitma

35、p, 0, 0, mPaint); / 触笔事件 public boolean onTouchEvent(MotionEvent event) return true; / 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) return true; / 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) return false; public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEv

36、ent event) return true; ,/* * 线程处理 */ public void run() while (!Thread.currentThread().isInterrupted() try Thread.sleep(100); catch (InterruptedException e) Thread.currentThread().interrupt(); /使用postInvalidate可以直接在线程中更新界面 postInvalidate(); ,运行效果展示,5.2.11 全屏显示,我们前面所写的程序在运行时屏幕顶部都带有标题栏和系统信息栏,但在开发游戏时,会

37、因为界面美观等因素不需要显示这些多余的界面,而将更多的区域留给游戏界面来控制,这就需要实现设置全屏模式。通过requestWindowFeature方法可以设置标题栏是否显示,通过setFlags方法设置全屏模式。,案例代码,package com.yarin.android.Examples_05_13; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.Window; import android.view.Wi

38、ndowManager; public class Activity01 extends Activity /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); /* 设置为无标题栏 */ requestWindowFeature(Window.FEATURE_NO_TITLE); /* 设置为全屏模式 */ getWindow().setFlags(WindowMa

39、nager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); /* 设置为横屏 */ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.main); ,运行结果如下,5.2.12 获得屏幕属性,市面上手机样式非常多,而且屏幕大小不一,大家肯定希望自己开发的程序能适合各种屏幕大小的手机。这就需要我们在开发时不要把一些坐标设置为定值,而是通过计算得出。这样不管安装在什

40、么手机,都不需要做很大的改动就能正常显示。要计算坐标等变量的值,肯定需要一个值作为参考,这里做好的参考值就是屏幕的宽度和高度。,Android 中的DisplayMetrics定义一些屏幕属性,可以通过getMetrics方法得到当前的屏幕的DisplayMetrics属性,从而取得屏幕的宽和高下面通过一个例子具体展示,具体运行结果如下:,源代码如下,public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 定义Dis

41、playMetrics对象 */ DisplayMetrics dm = new DisplayMetrics(); /* 取得窗口属性 */ getWindowManager().getDefaultDisplay().getMetrics(dm); /* 窗口的宽度 */ int screenWidth = dm.widthPixels; /* 窗口的高度 */ int screenHeight = dm.heightPixels; mTextView = (TextView) findViewById(R.id.TextView01); mTextView.setText(“屏幕宽度:“

42、 + screenWidth + “n屏幕高度:“ + screenHeight); ,5.3 动画实现,Android平台提供了两类动画,一类是Tween动画,即通过对场景里的对象不断进行图像变换(平移、旋转、缩放)来产生动画效果;第二类是Frame动画化,及顺序播放事先做好的图像,和电影类似,本节我们将分别学习这两种动画的实现原理,最后会结合Java ME 开发经验讲解GIF动画实现的原理。,5.3.1 Tween 动画,首先来分析 Tween动画,Tween动画通过对View 的内容完成一系列的的图形变换(包括平移、缩放、旋转、改变透明度)来实现动画效果。它主要包括以下四种动画效果: A

43、lpha: 渐变透明度动画效果。 Scale: 渐变尺寸伸缩动画效果。 Translate: 画面转移位置移动动画效果 Rotate: 画面转移旋转动画效果。,具体来讲,Tween动画是通过预先定义一组指令,这些指令指定了图形变换的类型、触发时间、持续时间。程序沿着时间线执行这些指令就可以实现动画效果。因此我们首先需要定义Animation动画对象,然后设置该动画的一些属性,最后通过 startAnimation 方法来开始动画。网上的大多数例子都是以 xml文件的形式配置的 我们这里用代码实现一下。其实可能也不难就是参数有些多。下面就介绍 各个动画的属性:,AlphaAnimation(fl

44、oat fromAlpha, float toAlpha) 功能:构建一个渐变透明度动画 参数: fromAlpha 为动画起始透明度;toAlpha为动画结束透明度(0.0表示完全透明,1.0表示完全不透明)。 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 功能:构建一个渐变尺寸伸缩动画。 参数:fromX、toX 分别是起始和结束时X坐标上的伸缩尺寸。fromY、toY分别

45、是起始和结束时 Y坐标上的伸缩尺寸。pivotXValue、pivotYValue 分别为动画相对于物件的X、Y坐标的开始位置 pivotYType pivotXType 分别为x、y的伸缩模式。,TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 功能:构建一个画面转换位置移动动画。 参数:fromXDelta、fromXDelta分别为起始坐标; toXDelta、toYDelta分别为结束坐标。 RotateAnimation(float fromDegress, f

46、loat toDegress, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 功能:构建一个旋转动画。 参数:fromDegress 为开始的角度; toDegress 为结束的角度。 pivotXType、pivotYType分别为x、y 的伸缩模式。pivotXValue、pivotYValue 分别为伸缩动画相对于x、y的坐标的开始位置。,setDuration(long durationMillis) 功能:设置动画显示的时间 以毫秒为单位。 startAnimation(Animation

47、animation) 功能:开始播放动画 参数:animation为要播放的动画。,下面我们通过具体的例子来看这些动画是如何实现的,AlphaAnimation 动画、ScaleAnimation动画、TranslateAnimation动画、RotateAnimation动画分别如后图所示。分别通过操作上、下、左、右四个方向键来显示动画效果。完整代码请参见课本P146.,5.3.2 Frame 动画,大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它。它的使用更加简单,只需要创建一个AnimationDrawabledF对象来表示Frame动画,然后通过addFra

48、me 方法把每一帧要显示的内容添加进去,最后通过start 方法就可以播放这个动画了,同时还可以通过 setOneShot方法设置是否重复播放。 下面就是一个用Frame动画模拟日全食的效果。先看看效果。,5.3.3GIF 动画播放,Gif动画大家都很熟悉,gif格式的图片本身是可以做成动画效果的,要是能直接播放gif动画,做游戏界面就会变得很轻松。程序员可以不用自己做动画,只要直接播放美工做好的gif动画就行了。下面我们先看看播放gif动画效果。,演示效果,上图是播放一张gif动画,要想播放gif动画,首要对gif图像进行解码,然后将动画的每一帧分别提取出来保存在一个容器中。然后需要联系绘制每一帧,这样就可以轻松实现gif动画播放,这个逻辑非常简单。详细代码见书本P153.,本章小结,本章首先介绍了android手机开发框架,然后介绍了图形图像的绘制方法,最后着重介绍了android中两种动画的实现原理,以及在android平台如何实现gif播放动画。这些知识基本能满足游戏开发的需求,当然,游戏开发还需要进行大量的图形图像的处理,以及动画的实现,每一节都提供了一个实例供大家参考,希望大家在理解理论内容的同时,学会实际操作,对于复杂的游戏来说,还需要更高级的处理和优化,有兴趣的自己研究学习。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1