`
onewayonelife
  • 浏览: 252986 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

Android SurfaceView基础

 
阅读更多

MySurfaceView

package org.wp.activity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * SurfaceHolder.Callback 接口:
 * 只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了
 * SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,
 * SurfaceHolder.Callback具有如下的接口:
 *         1> surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。
 *                                                  程序可以在该函数中做些和绘制界面相关的初始化工作,
 *                                                  一般情况下都是在另外的线程来绘制界面,
 *                                                  所以不要在这个函数中绘制Surface。
 *         2> surfaceChanged(SurfaceHolder holder, int format, int width, int height):
 *                                                  当Surface的状态(大小和格式)发生变化的时候会调用该函数,
 *                                                  在surfaceCreated调用后该函数至少会被调用一次。
 *         3> surfaceDestroyed(SurfaceHolder holder):当Surface销毁时会调用该函数
 * 
 * SurfaceHolder 类:
 * 它是一个用于控制surface的接口,它提供了控制surface的大小,格式,上面的像素,即监视其改变的。 
 * SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface就在SurfaceHolder对象内。
 * 虽然Surface保存了当前窗口的像素数据,但是在使用过程中是不直接和Surface打交道的,
 * 由SurfaceHolder的Canvas lockCanvas()或则Canvas lockCanvas()函数来获取Canvas对象,
 * 通过在Canvas上绘制内容来修改Surface中的数据。
 * 
 * 如果Surface不可编辑或则尚未创建调用该函数会返回null,
 * 在 unlockCanvas() 和 lockCanvas()中Surface的内容是不缓存的,
 * 所以需要完全重绘Surface的内容,为了提高效率只重绘变化的部分
 * 则可以调用lockCanvas(Rect rect)函数来指定一个rect区域,
 * 这样该区域外的内容会缓存起来。
 * 
 * 在调用lockCanvas函数获取Canvas后,SurfaceView会获取Surface的
 * 一个同步锁直到调用unlockCanvasAndPost(Canvas canvas)函数才释放该锁,
 * 这里的同步机制保证在Surface绘制过程中不会被改变(被摧毁、修改)。
 * 
 * 我没有在该surfaceview的初始化函数中将其 ScreenW 与 ScreenH 进行赋值,
 * 这里要特别注意,如果你在初始化调用ScreenW = this.getWidth(); 和 ScreenH = this.getHeight();
 * 那么你将得到很失望的值 全部为0;原因是和接口Callback接口机制有关,
 * 当我们继承callback接口会重写它的surfaceChanged()、surfaceCreated()、surfaceDestroyed(),
 * 这几个函数当surfaceCreated()被执行的时候,真正的view才被创建,也就是说之前得到的值为0 ,
 * 是因为初始化会在surfaceCreated()方法执行以前执行,view没有的时候我们去取屏幕宽高肯定是0,
 * 所以这里要注意这一点;
 * 这里我把draw的代码都try起来,主要是为了当画的内容中一旦抛出异常了,那么我们也能 在finally中执行该操作。
 * 这样当代码抛出异常的时候不会导致Surface出去不一致的状态。   
 * 其实这就是一个简单的游戏架构了,当然还少了按键处理,声音播放等等。
 * 
 * @author wp
 * 
 */
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
	private static final String TAG = "MySurfaceView";

	private SurfaceHolder sfh;
	private Thread th;
	private Paint paint;
	private Canvas canvas;
	private int ScreenW, ScreenH;

	public MySurfaceView(Context context) {
		super(context);
		sfh = this.getHolder();
		sfh.addCallback(this);
		th = new Thread(this);
		paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.RED);
		this.setKeepScreenOn(true);
	}

	/**
	 * 自己定义的draw()方法, 放在线程中不断调用的
	 */
	private void draw() {
		try {
			Log.i(TAG, "draw()");
			canvas = sfh.lockCanvas(); // 得到一个canvas实例
			canvas.drawColor(Color.WHITE); // 刷屏
			canvas.drawText("MySurfaceView", 100, 100, paint); // 画文字文本
			canvas.drawText("这是一个简单的游戏框架", 100, 160, paint);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (canvas != null)
				sfh.unlockCanvasAndPost(canvas); // 将画好的画布提交
		}
	}

	@Override
	public void run() {
		while (true) {
			draw();
			try {
				Thread.sleep(100);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		Log.i(TAG, "surfaceCreated()");
		ScreenW = this.getWidth();
		ScreenH = this.getHeight();
		Log.i(TAG, "ScreenW:" + ScreenW + " ScreenH:" + ScreenH);
		th.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		Log.i(TAG, "surfaceChanged()");
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		Log.i(TAG, "surfaceDestroyed()");
	}
}

 

 

 

分享到:
评论

相关推荐

    android surfaceview自定义拍照 绘制头像轮廓

    android surfaceview自定义拍照 绘制头像轮廓 注明:是借用网上的demo基础上进行修改的

    android SurfaceView游戏框架

    SurfaceView游戏框架实例,讲解如何使用,如何掌握基础性东西

    android视频播放器SurfaceView

    一个播放本地视频的播放器,可供使用和学习。 实现功能: 1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;...3、包括进度条,播放和暂停...SurfaceView + MediaPlayer,RecycleView,FloatingActionButton

    【Android基础】(12)SurfaceView绘图API详解

    【Android基础】(12)SurfaceView绘图API详解代码

    Android 自定义SurfaceView详解

    本文主要介绍Android SurfaceView自定义方法,这里对SurfaceView的基础知识做了详解,并附简单的示例代码,以便参考,有需要的小伙伴可以参考下

    android 使用SurfaceView实现小球高处落下并弹起的效果

    android 使用SurfaceView实现小球高处落下并弹起的效果 此程序是在《android游戏开发大全》第7章第2节案例的基础上做的改进

    基于Android MediaPlayer+SurfaceView实现的播放器列子.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于...总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    android开发揭秘PDF

    第3章 Android程序设计基础 3.1 Android程序框架 3.1.1 Android项目目录结构 3.1.2 Android应用解析 3.2 Android的生命周期 3.3 Android程序U设计 3.4 小结 第4章 用户界面开发 4.1 用户界面开发详解 4.1.1 用户...

    笔试题(Android100选择题).doc

    Android 系统提供了多种视频播放组件,包括 SurfaceView 和 VideoView。VideoView 组件可以控制播放的位置和大小。 Android 系统提供了多种机制和组件,用于开发移动应用程序。了解这些机制和组件是开发 Android ...

    台湾高焕堂Android讲义

    1.高焕堂讲解 Intent-based Programming.doc 2.高焕堂讲解 ContentProvider范例.doc 3.实际演练Android仿真器之操作.doc ...31.软硬整合开发的基础 认识Android的线程Thread模式.doc 33.认识Binder.java类别的角色.doc

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

     第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U设计  3.4 小结  第4章 用户界面开发  4.1 用户界面开发...

    Android最佳学习路线图.docx

    1. 图形图像 View、SurfaceView:熟练 Android 平台的图形图像处理 API、能够使用这些 API 绘制图形、动画等。 2. 游戏引擎初步:学习游戏引擎的基本概念和使用方法。 3. 游戏引擎音效模块:熟练游戏引擎的音效处理...

    Android应用开发揭秘pdf高清版

    《Android应用开发揭秘》内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏...

    android开发资料大全

    《android基础教程合集》 Android实例教程 会员贡献索引贴 实用Android开发工具和资源精选 APK权限大全 - Android必懂知识 最无私的Android资料(书籍+代码)分享[总结] Android中文帮助教程(非常合适新手入门) ...

    《Android应用开发揭秘》源码

     第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U设计  3.4 小结  第4章 用户界面开发  4.1 用户界面开发...

    Android代码-MediaUtils

    重绘了录制视频和录音时的两个自定义view,可在原本基础上进行二次开发 提供了视频截图方法,支持双击放大,支持自动对焦 视频录制暂时使用 SurfaceView Camera , 后续会升级为 TextureView Camera2 简单的加了

    android视频播放器

    使用SurFaceView基础android MediaPlayer接口实现网络和本地视频的播放。

    Android 实例实现自定义Camera和前后置摄像头切换以及图片缩小放大预览

    在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍。 根据api的介绍,对于Camera应用可以简单总结以下几个步骤。 1.检查Camera是否存在,并在AndroidManifest.xml中赋予相关的权限; 2....

Global site tag (gtag.js) - Google Analytics