`
Dewing
  • 浏览: 6035 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论
  • MNTMs: 这是饼,还不是球,java中自带有一个画圆的方法,是可以设置颜 ...
    线程游戏

Android 简单动画中SurfaceView 的应用

阅读更多

 一、对SurfaceView  的认识:     

    在Android中,SurfaceView是View的子类,它内嵌了一个专门用于绘制的Surface,我们可以控制这个Surface的格式和尺寸,Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,说明它总在自己所在窗口的后面。SurfaceView提供了一个可见区域,只有在这个可见区域内的surface内容才可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面有透明控件,那么每次surface变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。SurfaceView默认使用双缓冲技术的,它支持在子线程中绘制图像,这样就不会阻塞主线程了,所以它更适合于游戏的开发。

  SurfaceView使用的方式与任何View所派生的类都是完全相同的。可以像其他View那样应用动画,并把它们放到布局中。SurfaceView封装的Surface支持所有标准的Canvas方法进行绘图,同时也支持完全的OpenGL ES 库。

二、创建SurfaceView控件:

   首先我们需要继承SurfaceView并实现SurfaceHolder.Callback接口,这是因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。接着我们需要实现它的3个方法:

1. surfaceCreated(SurfaceHolder holder):surface创建的时候调用,一般在该方法中启动绘图的线程。
2. surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸发生改变的时候调用,如横竖屏切换。
3. surfaceDestroyed(SurfaceHolder holder) :surface被销毁的时候调用,如退出游戏画面,一般在该方法中停止绘图线程。
同时,我们还需要获得SurfaceHolder,并添加回调函数holder.addCallback(this);,这样这三个方法才会执行。另外,在绘制时,锁定画布,画布用完后要释放holder.unlockCanvasAndPost(canvas);

 

Android 简单动画的代码:

MainActivity.java

 

package com.example.cartoon;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//实例化SurfaceView
		BallSurfaceView sv = new BallSurfaceView(this);
		setContentView(sv);
	}
	
}

 

BallSurfaceView.java

 

package com.example.cartoon;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class BallSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable{
	private SurfaceHolder holder;
	private boolean runFlag;
	private Paint paint = new Paint();
	
	//重写构造方法
	public BallSurfaceView(Context context) {
		this(context, null);	
	}
	
	public BallSurfaceView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);	
	}
	
	public BallSurfaceView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		//获取Surface句柄对象,通过该对象获取画布
		holder = this.getHolder();
		//添加回调接口
		holder.addCallback(this);
//		setFocusable(true);		
	}
	
	//实现SurfaceHolder.Callback接口的方法
	@Override//当切换横竖屏时调用
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		
	}

	//当SurfaceView创建时调用
	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
		//创建时启动线程
		runFlag = true;
		new Thread(this).start();		
	}

	//当SurfaceView结束时调用
	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
		//退出时结束线程
		runFlag = false;		
	}
	
	//重写run方法
	@Override
	public void run() {
		int x = 0;
		int y = 0;
		int dx = 2;
		int dy = 3;
		int width = 30;
		int height = 30;
		while(runFlag){
			Canvas canvas = null;
			try {
				//锁定画笔对象
				canvas = holder.lockCanvas();
				//设置画笔
				paint.setColor(Color.WHITE);
				paint.setStyle(Paint.Style.FILL);
				//填充背景颜色
				Rect rect = new Rect(0, 0, this.getWidth(), this.getHeight());
				canvas.drawRect(rect, paint);
				
				//绘制小球,设置小球颜色为红
				paint.setColor(Color.RED);
				RectF rf = new RectF(x, y, x+width, y+height);
				canvas.drawOval(rf, paint);
				
				//小球移动
				x += dx;
				y += dy;
				//边界判断
				if(x<=0 || x>=this.getWidth()){
					dx = -dx;
				}
				if(y<=0 || y>=this.getHeight()){
					dy = -dy;
				}

				Thread.sleep(40);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				//画布用完要释放
				if(canvas != null){
					holder.unlockCanvasAndPost(canvas);
				}
			}			
		}		
	}
}




 

 

  • 大小: 10.1 KB
分享到:
评论

相关推荐

    Android利用SurfaceView实现下雨的天气动画效果

    可以看到效果图中的雨滴的下落速度很快,那么意味着每一帧都要调用 onDraw() 一次使其重新绘制一次,假如你的 onDraw() 方法里面的渲染代码稍微有点费时,而 View 的 onDraw() 方法调用是在 UI 线程中,那么绘制出

    《Android应用开发揭秘》附带光盘代码.

    《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言  第一部分 准备篇  第1章 Android开发简介  1.1 Android基本概念  1.1.1 Android简介  1.1.2 Android的系统构架  1.1.3 ...

    《Android应用开发揭秘》源码

     8.3.2 Socket应用(简易聊天室)  8.4 网络通信的中文乱码问题  8.5 WebKit应用  8.5.1 WebKjt概述  8.5.2 WebView浏览网页  8.5.3 WebView与Javascript  8.6 WtFi介绍  8.7 蓝牙  8.8 小结  第9章 Android...

    21天学习android开发教程之SurfaceView与多线程的混搭

    SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门...

    Android应用之SurfaceView的双缓冲使用

    这次介绍SurfaceView的双缓冲使用。双缓冲是为了防止动画闪烁而实现的一种多线程应用,基于SurfaceView的双缓冲实现很简单,开一条线程并在其中绘图即可。

    Android提高之SurfaceView与多线程的混搭实例

    前文简单介绍了Android中SurfaceView的基本使用,本文就来介绍一下SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    android-openGL-canvas:一个Android库,提供使用openGL画布在SurfaceView或TextureView上绘制内容的视图

    项目应用功能提供一个类似Android Canvas类的使用OpenGL来实现实现的canvasGL。可以像传统自定义View那样直接继承GLViews,再使用这个canvas替换需要的东西。提供类似GPUImage里的Filter的API,可以在使用画布GL画...

    Android高级编程--源代码

    6.2 保存简单的应用程序数据 160 6.2.1 创建和保存preference 160 6.2.2 检索共享的preference 161 6.2.3 保存活动状态 162 6.2.4 为地震查看器创建一个Preference页 165 6.3 保存和载入文件 174 6.3.1 将...

    android开发揭秘PDF

    8.3.2 Socket应用(简易聊天室) 8.4 网络通信的中文乱码问题 8.5 WebKit应用 8.5.1 WebKjt概述 8.5.2 WebView浏览网页 8.5.3 WebView与Javascript 8.6 WtFi介绍 8.7 蓝牙 8.8 小结 第9章 Android特色开发 9.1 传感器...

    android开发资料大全

    Android 动画效果二 Frame Animation 动画专题研究 Android新浪客户端开发教程(完整版)汇总大全 Android多媒体实例大汇集(源码,全) Android中利用画图类和线程画出闪烁的心形,送给亲爱的他 android自带的示例...

    《Android高级编程》

    9.2.1 在应用程序中使用SMS 9.2.2 发送SMS信息 9.2.3 监听SMS消息 9.2.4 紧急响应的SMS示例 9.2.5 紧急响应自动化 9.3 小结 第10章 访问Android硬件 10.1 使用媒体API 10.1.1 播放媒体资源 10.1.2 录制多媒体 10.2 ...

    疯狂Android讲义源码

     12.3.1 在Android应用中使用  OpenGL ES 454  12.3.2 绘制平面上的多边形 457  12.3.3 旋转 463  12.4 绘制3D图形 465  12.4.1 构建3D图形 465  12.4.2 应用纹理贴图 469  12.5 本章小结 475  第13章 ...

    android群雄传

    第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 ...

    《Google Android SDK开发范例大全(第3版)》.pdf

    7.26 在自定义的surfaceview上绘制动画 504 第8章 当android与internet接轨 509 8.1 http get/post传递参数 510 8.2 在程序里浏览网页 513 8.3 嵌入html标记的程序 516 8.4 设计前往打开网页功能 ...

    Google Android SDK开发范例大全(第3版) 1/5

    7.26 在自定义的SurfaceView上绘制动画 第8章 当Android与Internet接轨 8.1 HTTP GET/POST传递参数 8.2 在程序里浏览网页 8.3 嵌入HTML标记的程序 8.4 设计前往打开网页功能 8.5 将网络图像网址放入Gallery中显示 ...

Global site tag (gtag.js) - Google Analytics