`
onewayonelife
  • 浏览: 252465 次
  • 性别: 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 用户...

    台湾高焕堂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应用开发揭秘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....

    Android高级编程--源代码

    CruiseYoung提供的带有详细书签的电子书籍目录 ... 该资料是《Android高级编程》的源代码 ...本书的内容和示例提供了如何使用当前SDK来编写优秀的移动程序所需要的基础知识,同时也保持了快速适应未来版本...

    cfgnqk-takephotodemo-master.7z

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

Global site tag (gtag.js) - Google Analytics