`
onewayonelife
  • 浏览: 259755 次
  • 性别: 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是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理...因此,开发者需要具备扎实的Android基础知识,尤其是对多线程和图形渲染的理解,才能更好地应对可能出现的挑战。

    android surfaceview 悬浮窗圆角 windowmanager

    在Android开发中,`SurfaceView`是一个特殊类型的`View`,它允许开发者在应用程序中创建一个独立于应用程序主线程的渲染表面。...这个过程需要开发者具备扎实的Android基础知识和良好的问题解决能力。

    Android SurfaceView添加组件view不被组件覆盖-IT计算机-毕业设计.zip

    在Android开发中,...同时,它还涵盖了Android开发中的布局管理和事件处理等基础知识,对于理解Android系统和优化用户体验有极大的帮助。通过深入研究和分析这个源码,学生可以提升自己在Android应用开发中的技能。

    android SurfaceView游戏框架

    下面将详细阐述SurfaceView在游戏框架中的应用及其基础知识。 1. **SurfaceView的基本概念** SurfaceView是Android系统中的一个View类,它的特点在于它拥有自己的Surface,这个Surface位于应用程序窗口的底层,...

    Android 通过SurfaceView 实现实时显示摄像头视频

    总之,通过SurfaceView实现实时显示摄像头视频是Android开发中的一个基础任务,涉及到对Android系统相机API的理解和使用,以及对SurfaceView生命周期的掌握。随着技术的发展,开发者可以选择更高级的API,如Camera2...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...

    Android SurfaceView实现动画效果

    2. **动画基础**: 在Android中,有两种主要的动画机制:属性动画(Property Animation)和视图动画(View Animation)。SurfaceView通常不直接支持属性动画,但可以通过自定义绘制和定时器实现类似的效果。视图动画...

    android SurfaceView的基本用法

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为高效显示动态视频或复杂的2D/3D图形提供了一...这仅仅是SurfaceView的基础,更高级的应用还包括使用硬件加速、帧率控制等,这些都需要进一步的学习和实践。

    android SurfaceView编写小游戏简单代码

    在Android平台上开发游戏时,...在实际项目中,还需要考虑更多的细节,如碰撞检测、音效、动画效果等,但这些都建立在`SurfaceView`提供的基础之上。实践过程中,不断优化和完善,你的游戏将会变得更加有趣和引人入胜。

    surfaceview 多点触控移动放大缩小

    1. SurfaceView基础 SurfaceView不同于普通的View,它拥有自己的Surface对象,可以独立于UI线程进行渲染,避免了因为复杂的图形计算导致主线程阻塞,提升了性能。它通常用于需要连续、高性能渲染的应用,如游戏、...

    android surfaceview 播放视频

    在Android平台上,SurfaceView是一种非常重要的视图组件,它提供了在应用程序中显示复杂图形和视频内容的能力。在视频播放场景中,SurfaceView是常见的选择,因为它可以高效地处理多媒体数据,减少CPU占用,并且能够...

    android View、SurfaceView Demo

    View是Android UI的基础,几乎所有的可视元素,如按钮、文本框等,都是View或其子类的实例。它提供了基本的绘图功能,通过onDraw()方法来绘制内容。View的操作通常在主线程中进行,因此受到UI线程同步限制,不适合...

    android surfaceview例程

    在Android平台上,SurfaceView是一个非常重要的视图组件,它被设计用于处理高性能、低延迟的图形...通过对这个例程的分析和实践,将有助于理解和掌握SurfaceView的使用技巧,为开发高性能的Android应用打下坚实基础。

    android surfaceview 播放视频代码

    在Android开发中,...通过以上内容,你应该能够理解如何在Android应用中使用SurfaceView播放MP4视频,并具备实现这个功能的基础。在实际项目中,还可以根据需求进行优化,例如添加全屏切换、视频流播放等功能。

    基于android实现SurfaceView播放视频代码.rar

    这个名为"基于android实现SurfaceView播放视频代码.rar"的压缩包提供了实现这一功能的源码参考,对于初学者和经验丰富的开发者来说都是一份宝贵的资源。下面,我们将深入探讨如何利用Android的SurfaceView组件来播放...

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

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在独立于主线程的单独线程中进行高性能的图形绘制,常用于视频播放、游戏等需要频繁更新图像的应用场景。本篇文章将深入探讨SurfaceView的绘图API及其...

    SurfaceView增加放大缩小视频功能

    在这个"SurfaceViewDemo基础上增加放大,缩小视频的功能"项目中,我们将探讨如何利用`SurfaceView` 和 `MediaPlayer` 实现视频播放,并添加缩放功能。 首先,我们需要创建一个`SurfaceView` 对象,并将其添加到布局...

    Android SurfaceView实现画心

    总的来说,通过`SurfaceView`实现画心,不仅可以学习到Android图形绘制的基础知识,还能掌握多线程编程和优化技巧。这个过程可以帮助开发者更好地理解Android系统底层的工作机制,提升开发高性能应用的能力。同时,...

    Android SurfaceView抽奖转盘

    在Android开发中,`SurfaceView`是一个非常重要的组件,它主要用于处理高性能的图形渲染,比如游戏、动画或者像“抽奖转盘”这样的交互元素。在这个项目中,开发者使用`SurfaceView`来创建了一个功能完善的抽奖转盘...

    android之view和surfaceview用法示例汇总

    1. **View** 是Android UI框架的基础,所有可见的界面元素(如按钮、文本框等)都继承自View或其子类。开发者可以通过重写`onDraw()`方法来自定义绘制内容。 2. **生命周期**:View的绘制过程通常在主线程中进行,...

Global site tag (gtag.js) - Google Analytics