- 浏览: 116450 次
- 性别:
- 来自: 广州
文章分类
最新评论
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;
}
};
发表评论
文章已被作者锁定,不允许评论。
-
stopSelf()与stopSelf(startId)的区别
2016-04-14 14:44 1056startId:表示启动服务的次数 stopSelf(sta ... -
安装/卸载/替换成功广播接收
2016-01-08 11:59 745<receiver android:name=" ... -
ContentProivder
2015-12-09 09:26 457ContentProvider 我们实现了其中的几个方法 ... -
Android获取网络时间
2015-11-19 11:27 11081、实时获取: LocationManager locatio ... -
android animation知识
2015-11-14 11:47 539<?xml version="1.0" ... -
代码中设置android:drawableTop等
2015-11-14 10:42 976btnAttachment.setCompoundDrawab ... -
自定义View
2015-11-04 15:09 369一般来说,自定义View都会去重写onMeasure()方法, ... -
SimpleOnGestureListener
2015-11-04 12:03 484onScroll()缓慢滑动,手指滑动屏幕的过程中执行; on ... -
设置dialog在底部并宽度全屏显示
2015-11-02 11:53 2237pickerDialog.setContentView(vie ... -
横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效
2015-10-29 10:51 1717在之前的版本中都是在Manifest文件中设置Activity ... -
Dialog注意点
2015-10-28 17:14 473dialog:setCancelable与setCancele ... -
清除setBackgroundResource的原有值
2015-10-23 16:50 1103setBackgroundResource(0);清除原有的s ... -
接收隐式意图
2015-10-22 11:29 511想接收隐式意图,必须在他们的意图过滤器中配有:android. ... -
严苛模式
2015-10-14 20:25 1349//启用严苛模式,StrictMode可以用于捕捉发生在应用程 ... -
Android使用Animation完成动画保留最后一帧的办法
2015-09-08 10:43 2279在动画效果的xml中,在set标签中加上一条android:f ... -
控件getHeight和getWidth等于0的解决办法
2015-09-07 17:27 1339//监听layoutContainer是否初始化完成 l ... -
Service和Thread的区别?
2015-08-19 13:25 463servie是系统的组件,它由系统进程托管(servicema ... -
避免内存泄露
2015-08-18 19:21 4061、尽量避免在Activity使用static。 2、能使用A ... -
需要context的时候用activity还是application?
2015-08-17 17:02 671需要context的时候用activity还是applicat ... -
谈谈UI中, Padding和Margin有什么区别?
2015-08-10 17:18 1066Padding 文字对边框, margin是控件与控件之间的距 ...
相关推荐
对于游戏等对界面要求较高的程序,一般需要控制View中的具体图像显示(如动画功能)下面介绍实现此功能常用的SurfaceView控制。
Android 酷炫的加载动画源码包含了很多酷炫的加载动画,源码上采用了继承Drawable 策略者模式实现,可以与任何View配合使用作为加载动画。
雨松MOMO带你做游戏 Android 游戏开发之Tween动画的实现 欢迎大家下载阅读 哇咔咔~~~
叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip叠罗汉游戏,安卓java实现,自定义...
雨松MOMO带你做游戏 Android 游戏开发之使用AnimationDrable实现Frame动画 欢迎大家下载阅读。HOHO~~
基于Android的迷你桌球游戏设计与实现,包含源代码和毕业设计论文
在对系统进行详细需求分析的基础上,确定了系统的基本功能要求,对游戏的关卡设置、菜单界面、音效和动画、、时间控制、屏幕绘制、连通算法和布局算法进行了设计,并最终实现了一款风格清新可爱、娱乐体验丰富且性能...
通过这份源码,您可以学习到Android游戏开发的常用技术和方法,如视图绘制、事件处理、多线程编程等。同时,源码中的设计模式和算法实现也具有很好的参考价值。 此外,项目还支持多种定制功能,如界面风格切换、...
最近项目中有个需求,需要像《水果忍者》游戏中取得成就后,从屏幕顶部落下一张图片,3秒钟中后自动消失。 我相信大家有很多重方式实现,比如说:TimerTask + Timer。这里我向大家介绍一种比较简单的方式,使用 ...
android 游戏开发之Tween动画的实现~~~~~~~~~~~
android 经典帧动画 非游戏,当然游戏也可以借鉴。帧动画是通过多张连续图片组成。 项目首页是一个仿window8的磁贴效果, 帧动画界面上有一个 左右箭头的按钮,点击按钮并且滑动 动画会跟着滑动的方向转动
从零开始Android游戏编程(第二版),目录: 第一章 搭建开发环境.docx 第二章 创建第一个程序Hello Tank.docx 第三章 显示文字和图片.docx 第四章 响应用户事件.docx 第五章 小结——扫雷游戏的实现.docx 第六...
基于Android 游戏开发之Tween动画的实现
各种炮弹飞碟和坦克等效果使用了大量的绘图血量的计算也很多,按住屏幕上下滑动可以控制炮管角度,点击屏幕发射炮弹,另外如果摧毁了敌方的坦克或者飞碟会给自身加血,坦克行进过程中也有炮弹补给箱动画。...
2利用短距离无线传输新技术,实现联机游戏 展望未来,android游戏开发在更多层面,更广思路上,更多游戏情结和规则上,利用w ifi技术和蓝牙,EDGE,实现玩家联机对战。蓝牙是一种新型,开放且低成本的短距离无 线...
是否因为两个补间动画不连贯而烦恼。其实这时可以使用属性动画进行两组动画的拼接,使动画看起来更流畅。这个例子就是使用属性动画开发的一个弹球动画效果,参考性很强。
这是一个android 用OpenGl写的3D动画demo,导入工程即可运行,请注意在真机上运行比较流畅,在模拟器上运行,动画速度会变慢一点,不过一样可以运行
主要介绍了飞机的构造方法和我方战机与敌方战机的操控及动画实现 第20章 桌面类游戏——《激情台球》本章介绍了Android 3D游戏《激情台球》的开发。主要介绍了台球与台球的碰撞检测实现、台球与球桌的碰撞检测实现...
Android版2048游戏全逻辑代码简单实现,有兴趣的朋友可以看看。
2048游戏在android studio的实现,实现游戏规则,新游戏建立,最高分记录和游戏动画。