`

Android游戏中动画的实现 .

 
阅读更多

1. 介绍
对于游戏等对界面要求较高的程序,一般需要控制View中的具体图像显示(如动画功能)下面介绍实现此功能常用的SurfaceView控制。

1)       常用的绘制图像的方法

a)        View的invalidate()
直接调用onDraw()绘图

b)       View的postInvalidate()
通过消息调用onDraw()绘图

c)       SurfaceView
画布的重绘是由一个单独的线程处理,所以不会阻塞,专门为游戏而实现的。

2)       SurfaceView

a)        说明

                                      i.             它支持OpenGL ES,2D和3D效果都能实现

                                    ii.             在游戏线程中画图(而非主线程):冻结画布->在画布上绘图->解冻画布->次画布内容绘制到屏幕上

                                   iii.             采用双缓存,避免屏幕闪烁

b)       实现

                                      i.             需要实现Callback接口,它可以用来监听SurfaceView的状态,而从开启和销毁游戏主线程

                                    ii.             需要实现Runnable接口, 它实现了游戏绘图线程

3)       常见问题

a)        双缓存问题

                                      i.             原理:由于内存中存在着两个绘图区,每绘一次,显示其中一个绘图区(交替出现)

                                    ii.             问题:容易出现以下问题:有时只清除了其中一个绘图区,造成了画面叠加。只绘制了部分图像,与之前部分出现叠加。

                                   iii.             解决方法::每次清屏后再画(canvas.drawColor(Color.BLACK))

2. 例程

1)       功能
使用SurfaceView的方式在控件中实现动画

2)       关键字
Android, SurfaceView, 动画,游戏

3)       可从此处下载可独立运行的代码
http://download.csdn.net/detail/xieyan0811/4117465

4)       核心代码及说明

package com.demo.game;

 

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Color;

import android.os.Bundle;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

import android.content.Context;

import android.util.AttributeSet;

 

public class GameView extends SurfaceView implements Callback,Runnable {

   private boolean mIsRunning= false;

   private Canvas mCanvas =null;

   private SurfaceHoldermSurfaceHolder = null;

   private Thread mThread =null;

   private Paint mPaint =null;

   private int mY = 0;

 

   public GameView(Contextcontext, AttributeSet attr) {

            super(context,attr);

            mPaint = newPaint();

            mPaint.setColor(0xffff0000);

            mPaint.setStrokeWidth(3);

            mPaint.setAntiAlias(true);

 

            mSurfaceHolder =getHolder();

            mSurfaceHolder.addCallback(this);

   }

 

   public voidsurfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

   }

 

   public voidsurfaceCreated(SurfaceHolder arg0) {       //控制动画开始

            mIsRunning = true;

            mThread = newThread(this);

            mThread.start();

   }

 

   public voidsurfaceDestroyed(SurfaceHolder arg0) {    //控制动画结束

            mIsRunning =false;

            try {

                     mThread.join();

            } catch (Exceptione) {

                     e.printStackTrace();

            }

   }

 

   public void run() {               // 绘图线程

            while (mIsRunning){

                     try {

                               Thread.sleep(40);

                     } catch(InterruptedException e) {

                               e.printStackTrace();

                     }

                     synchronized(mSurfaceHolder) {

                               mCanvas= mSurfaceHolder.lockCanvas();

                               Draw();

                               mSurfaceHolder.unlockCanvasAndPost(mCanvas);

                     }

            }

   }

 

   private void Draw() {  // 绘图函数

            mCanvas.drawColor(Color.BLACK);  // 清空buffer,以避免图像叠加

            mCanvas.drawLine(0,mY, 300, mY, mPaint);

            mY++;

            if (mY > 300)

                     mY = 0;

   }

};

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android游戏中动画的实现

    对于游戏等对界面要求较高的程序,一般需要控制View中的具体图像显示(如动画功能)下面介绍实现此功能常用的SurfaceView控制。

    Android 酷炫的加载动画源码.zip

    Android 酷炫的加载动画源码包含了很多酷炫的加载动画,源码上采用了继承Drawable 策略者模式实现,可以与任何View配合使用作为加载动画。

    Android 游戏开发之Tween动画的实现

    雨松MOMO带你做游戏 Android 游戏开发之Tween动画的实现 欢迎大家下载阅读 哇咔咔~~~

    叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip

    叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义...

    Android 游戏开发之使用AnimationDrable实现Frame动画

    雨松MOMO带你做游戏 Android 游戏开发之使用AnimationDrable实现Frame动画 欢迎大家下载阅读。HOHO~~

    基于Android的迷你桌球游戏设计与实现

    基于Android的迷你桌球游戏设计与实现,包含源代码和毕业设计论文

    基于android平台的连连看游戏的实现.docx

    在对系统进行详细需求分析的基础上,确定了系统的基本功能要求,对游戏的关卡设置、菜单界面、音效和动画、、时间控制、屏幕绘制、连通算法和布局算法进行了设计,并最终实现了一款风格清新可爱、娱乐体验丰富且性能...

    Android项目中国象棋源码.rar

    通过这份源码,您可以学习到Android游戏开发的常用技术和方法,如视图绘制、事件处理、多线程编程等。同时,源码中的设计模式和算法实现也具有很好的参考价值。 此外,项目还支持多种定制功能,如界面风格切换、...

    Android 倒计时动画源码

    最近项目中有个需求,需要像《水果忍者》游戏中取得成就后,从屏幕顶部落下一张图片,3秒钟中后自动消失。 我相信大家有很多重方式实现,比如说:TimerTask + Timer。这里我向大家介绍一种比较简单的方式,使用 ...

    android 游戏开发之Tween动画的实现

    android 游戏开发之Tween动画的实现~~~~~~~~~~~

    android 经典帧动画源码

    android 经典帧动画 非游戏,当然游戏也可以借鉴。帧动画是通过多张连续图片组成。 项目首页是一个仿window8的磁贴效果, 帧动画界面上有一个 左右箭头的按钮,点击按钮并且滑动 动画会跟着滑动的方向转动

    从零开始Android游戏编程电子书 word之Docx版

    从零开始Android游戏编程(第二版),目录: 第一章 搭建开发环境.docx 第二章 创建第一个程序Hello Tank.docx 第三章 显示文字和图片.docx 第四章 响应用户事件.docx 第五章 小结——扫雷游戏的实现.docx 第六...

    Android Tween动画的实现

    基于Android 游戏开发之Tween动画的实现

    Android游戏源码2d坦克小游戏.zip

    各种炮弹飞碟和坦克等效果使用了大量的绘图血量的计算也很多,按住屏幕上下滑动可以控制炮管角度,点击屏幕发射炮弹,另外如果摧毁了敌方的坦克或者飞碟会给自身加血,坦克行进过程中也有炮弹补给箱动画。...

    基于android的游戏开发开题报告.doc

    2利用短距离无线传输新技术,实现联机游戏 展望未来,android游戏开发在更多层面,更广思路上,更多游戏情结和规则上,利用w ifi技术和蓝牙,EDGE,实现玩家联机对战。蓝牙是一种新型,开放且低成本的短距离无 线...

    android弹球动画property属性动画(自定义动画拼接)

    是否因为两个补间动画不连贯而烦恼。其实这时可以使用属性动画进行两组动画的拼接,使动画看起来更流畅。这个例子就是使用属性动画开发的一个弹球动画效果,参考性很强。

    android OpenGl实现3D动画demo源码

    这是一个android 用OpenGl写的3D动画demo,导入工程即可运行,请注意在真机上运行比较流畅,在模拟器上运行,动画速度会变慢一点,不过一样可以运行

    基于OpenGL的Android+3D游戏开发技术详解与典型案例(源码)

    主要介绍了飞机的构造方法和我方战机与敌方战机的操控及动画实现  第20章 桌面类游戏——《激情台球》本章介绍了Android 3D游戏《激情台球》的开发。主要介绍了台球与台球的碰撞检测实现、台球与球桌的碰撞检测实现...

    Android版2048游戏java代码实现

    Android版2048游戏全逻辑代码简单实现,有兴趣的朋友可以看看。

    2048游戏的android实现

    2048游戏在android studio的实现,实现游戏规则,新游戏建立,最高分记录和游戏动画。

Global site tag (gtag.js) - Google Analytics