- 浏览: 120483 次
- 性别:
- 来自: 广州
文章分类
最新评论
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 1106startId:表示启动服务的次数 stopSelf(sta ... -
安装/卸载/替换成功广播接收
2016-01-08 11:59 789<receiver android:name=" ... -
ContentProivder
2015-12-09 09:26 486ContentProvider 我们实现了其中的几个方法 ... -
Android获取网络时间
2015-11-19 11:27 11771、实时获取: LocationManager locatio ... -
android animation知识
2015-11-14 11:47 574<?xml version="1.0" ... -
代码中设置android:drawableTop等
2015-11-14 10:42 1016btnAttachment.setCompoundDrawab ... -
自定义View
2015-11-04 15:09 400一般来说,自定义View都会去重写onMeasure()方法, ... -
SimpleOnGestureListener
2015-11-04 12:03 539onScroll()缓慢滑动,手指滑动屏幕的过程中执行; on ... -
设置dialog在底部并宽度全屏显示
2015-11-02 11:53 2288pickerDialog.setContentView(vie ... -
横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效
2015-10-29 10:51 1778在之前的版本中都是在Manifest文件中设置Activity ... -
Dialog注意点
2015-10-28 17:14 510dialog:setCancelable与setCancele ... -
清除setBackgroundResource的原有值
2015-10-23 16:50 1157setBackgroundResource(0);清除原有的s ... -
接收隐式意图
2015-10-22 11:29 543想接收隐式意图,必须在他们的意图过滤器中配有:android. ... -
严苛模式
2015-10-14 20:25 1373//启用严苛模式,StrictMode可以用于捕捉发生在应用程 ... -
Android使用Animation完成动画保留最后一帧的办法
2015-09-08 10:43 2417在动画效果的xml中,在set标签中加上一条android:f ... -
控件getHeight和getWidth等于0的解决办法
2015-09-07 17:27 1420//监听layoutContainer是否初始化完成 l ... -
Service和Thread的区别?
2015-08-19 13:25 494servie是系统的组件,它由系统进程托管(servicema ... -
避免内存泄露
2015-08-18 19:21 4791、尽量避免在Activity使用static。 2、能使用A ... -
需要context的时候用activity还是application?
2015-08-17 17:02 747需要context的时候用activity还是applicat ... -
谈谈UI中, Padding和Margin有什么区别?
2015-08-10 17:18 1097Padding 文字对边框, margin是控件与控件之间的距 ...
相关推荐
在Android应用开发中,逐帧动画是一种常见的动画形式,它通过连续播放一系列静态图像...这个源码项目是学习Android动画系统的好起点,可以帮助开发者熟练掌握Android平台上的动画实现,提升应用的视觉吸引力和交互性。
接下来,我们将深入探讨`SurfaceView`以及如何在Android游戏中实现动画。 1. **SurfaceView的基本概念**: - `SurfaceView`是一个可以在窗口上创建一个独立于应用程序主UI线程的显示区域的视图。 - 它包含一个`...
总的来说,通过研究《Abduction》的开场动画源代码,开发者不仅可以了解到Android游戏的基本架构,还能学习到如何在Android平台上实现流畅、生动的动画效果。这对于想要涉足Android游戏开发的人来说,无疑是一份宝贵...
在Android平台上,逐帧动画是一种常见的动画实现方式,它通过连续播放一系列静态图像来创造出动态效果,类似于传统的电影制作。这个"Android逐帧动画源码.zip"文件包含了一个关于如何在Android应用中实现逐帧动画的...
在Android开发中,显示GIF动画是一项常见的需求,特别是在创建社交应用、游戏或者任何需要动态图展示的场景。本资源“Android程序研发源码Android 显示GIF动画源码.zip”提供了一个名为“GifViewDemo”的示例项目,...
在Android应用开发中,逐帧动画(Frame-by-Frame Animation)是一种常见的动画实现方式,尤其适用于游戏或复杂的交互效果。本资源"Android程序研发源码Android 逐帧动画源码.zip"提供了一个名为"AnimationDemo"的...
在加载动画的场景中,每个具体的动画实现都是一个策略,可以根据需要选择或切换不同的动画策略。 2. **自定义加载动画**: 自定义加载动画通常涉及重写Drawable的`draw()`方法,根据动画状态绘制每一帧。此外,还...
1. **帧动画(Frame Animation)**:如果雷达动画是通过帧动画实现的,那么它会包含一系列静态的图片,这些图片按照一定的顺序和时间间隔播放,模拟连续运动的效果。开发者可能使用`AnimationDrawable`类来管理这些...
帧动画在Android开发中是一种常见的动画形式,尤其在游戏和动态图示设计中扮演着重要角色。本资源提供了Android经典帧动画的源码,旨在帮助开发者深入理解帧动画的工作原理,并提供实践参考。 一、帧动画简介 帧...
在Android游戏开发中,Tween动画是一种非常常见的动画形式,它主要用于实现对象的平滑移动、缩放、旋转等效果。Tween动画,源自于图形设计领域,意为“时间插值”,在Android中,它是通过`android.animation....
【标题】"Android游戏开发:基于Android系统的雷电游戏源代码" 【描述】"这个压缩包包含了一款在Android平台上实现的雷电游戏的完整源代码。开发者通过编译这些源代码,可以生成APK安装文件,进而将其安装到手机上...
在Android游戏开发中,动画是提升用户体验和游戏沉浸感的关键因素。AuroraGT便是一款专为Android平台设计的游戏开发动画编辑器,旨在帮助开发者轻松创建流畅、生动的游戏动画。这款工具提供了丰富的功能和易用的界面...
在Android中,我们可以使用ValueAnimator或ObjectAnimator来实现自定义动画。ValueAnimator允许我们指定动画的起始值和结束值,并在动画过程中提供回调,让我们能够控制每一帧的动画效果。对于抛物线动画,我们首先...
在Android游戏开发中,帧动画(Frame Animation)是一种常见的动态效果实现方式,它通过连续播放一系列静态图片来创建动画效果。本教程将聚焦于如何利用`AnimationDrawable`类来实现这种动画。`AnimationDrawable`是...
下面我们将深入探讨如何在Android中实现这样的晃动动画。 1. **创建晃动动画** 在Android中,我们可以使用`ObjectAnimator`或`ValueAnimator`来创建自定义动画。晃动动画通常涉及到视图位置的改变,通过在X轴上...
这份"安卓Android源码——斗地主源码实现.zip"提供的压缩包包含了一个完整的斗地主游戏的源代码实现,其中主要的文件是"Android斗地主[牌桌实现源码].pdf"。这里我们将详细探讨这个项目中的核心知识点。 1. **...
这个压缩包"安卓动画效果相关-Android火焰效果程序源码.rar"包含了一个特定的动画实现,即火焰效果的源代码。让我们深入探讨一下Android动画系统以及如何创建火焰效果。 在Android中,动画可以分为两种主要类型:...
在Android游戏中,通常使用Canvas和Bitmap来绘制2D图形,通过SurfaceView或TextureView实现流畅的动画。项目中的注释可能涵盖了如何使用这些类创建游戏元素和实现动态效果。 【事件处理与多线程】 Android的事件...