Surface和SurfaceView以及SurfaceHolder的认识及使用

MainActivity如下:

package cn.testcleancanvas;
import android.os.Bundle;
import android.app.Activity;
/**
 * Demo描述:
 * 0 Surface和SurfaceView以及SurfaceHolder的认识及使用
 * 1 Canvas清屏的实现
 * 2 在SurfaceView上不断绘制图片
 *   所绘制的图片在屏幕上的X轴值不断变化,所以给人感觉该图片在不断地移动.
 *   所以给我们一个启示:看到一个图片在屏幕上不停地移动不一定是利用动画做出来
 *   的效果,还有可能是draw出来的
 *
 * 笔记摘要:
 * 1 Surface用于管理数据,SurfaceView用于展示数据
 * 2 SurfaceHolder是一个接口,其作用相当于是Surface的监听器.
 *   SurfaceHolder提供了访问和控制SurfaceView背后的Surface的相关方法.
 *   即SurfaceHolder通过三个回调方法可知Surface的创建、销毁或者改变
 *   可通过SurfaceView中的方法getHolder()获得SurfaceView所对应的Surface所对应的SurfaceHolder
 * 3 SurfaceView是在一个新线程中绘制图像,而不是在UI线程
 *
 * 参考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/7351317
 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309
 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457
 *   Thank you very much
 *
 */
public class MainActivity extends Activity {
    private ImageMovingSurfaceView mImageMovingSurfaceView;
    private PhotoMovingSurfaceView mPhotoMovingSurfaceView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//方式一:
		mImageMovingSurfaceView=
		new ImageMovingSurfaceView(MainActivity.this);
		setContentView(mImageMovingSurfaceView);

		//方式二:
//		mPhotoMovingSurfaceView=
//		new PhotoMovingSurfaceView(MainActivity.this);
//		setContentView(mPhotoMovingSurfaceView);
	}

}

 

ImageMovingSurfaceView如下:

package cn.testcleancanvas;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff.Mode;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
 * 参考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/7351317
 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309
 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457
 *
 * Thank you very much
 */
public class ImageMovingSurfaceView extends SurfaceView implements Callback {
	private int lastX=0;
	private Paint mPaint;
	private Bitmap mBitmap;
	private Canvas mCanvas;
	private boolean isSurfaceRun = true;
	private SurfaceHolder mSurfaceHolder;
	private DrawMovingImageThread mDrawMovingImageThread;

	public ImageMovingSurfaceView(Context context) {
		super(context);
		init();
	}

	private void init(){
		mPaint=new Paint();
		//获取SurfaceView的SurfaceHolder
		mSurfaceHolder=this.getHolder();
		//为SurfaceHolder设置回调
		mSurfaceHolder.addCallback(this);
		mDrawMovingImageThread=new DrawMovingImageThread();
		mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	}

	//开启线程不断地绘制Bitmap
	private class DrawMovingImageThread extends Thread{
		@Override
		public void run() {
			super.run();
			while (isSurfaceRun) {
				drawMovingImage();
				try {
					Thread.sleep(300);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void drawMovingImage(){
		//从SurfaceHolder获取画布,并在锁定后开始绘画
		mCanvas=mSurfaceHolder.lockCanvas();
		if (mCanvas!=null) {
			//以下四行为清屏的核心代码:
			Paint paint = new Paint();
			paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
			mCanvas.drawPaint(paint);
			paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
			//在每次画之前先进行清屏
			mCanvas.drawBitmap(mBitmap, lastX, 40, mPaint);
			lastX+=20;
			if (lastX>=370) {
				lastX=0;
			}
			//解锁
			mSurfaceHolder.unlockCanvasAndPost(mCanvas);
		}
	}

	//以下三个方法为android.view.SurfaceHolder.Callback接口的实现
	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
          mDrawMovingImageThread.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
           isSurfaceRun=false;
	}

}

PhotoMovingSurfaceView如下:

package cn.testcleancanvas;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff.Mode;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
 * 参考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/7351317
 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309
 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457
 *
 * Thank you very much
 */
public class PhotoMovingSurfaceView extends SurfaceView implements Callback {
	private int lastX=0;
	private Paint mPaint;
	private Bitmap mBitmap;
	private Canvas mCanvas;
	private boolean isSurfaceRun = true;
	private SurfaceHolder mSurfaceHolder;
	private DrawMovingImageThread mDrawMovingImageThread;

	public PhotoMovingSurfaceView(Context context) {
		super(context);
		init();
	}

	private void init(){
		mPaint=new Paint();
		//SurfaceView的方法getHolder()
		mSurfaceHolder=this.getHolder();
		mSurfaceHolder.addCallback(this);
		mDrawMovingImageThread=new DrawMovingImageThread();
		mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	}

	//开启线程不断地绘制Bitmap
	private class DrawMovingImageThread extends Thread{
		@Override
		public void run() {
			super.run();
			while (isSurfaceRun) {
				drawMovingImage();
				try {
					Thread.sleep(300);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void drawMovingImage(){
		mCanvas=mSurfaceHolder.lockCanvas();
		if (mCanvas!=null) {
			//以下四行为清屏的核心代码:
			Paint paint = new Paint();
			paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
			mCanvas.drawPaint(paint);
			paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
			//在每次画之前先进行清屏
			mCanvas.drawBitmap(mBitmap, lastX, 40, mPaint);
			lastX+=20;
			if (lastX>=370) {
				lastX=0;
			}
			mSurfaceHolder.unlockCanvasAndPost(mCanvas);
		}
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		mDrawMovingImageThread.start();
	}

	//以下三个方法为android.view.SurfaceHolder.Callback接口的实现
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		//调用SurfaceView的onDraw()方法
		onDraw(null);
	}

	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
           isSurfaceRun=false;
	}

}

main.xml如下:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

</RelativeLayout>

 

时间: 2024-09-04 19:29:21

Surface和SurfaceView以及SurfaceHolder的认识及使用的相关文章

Android实时取景:用SurfaceView实现

对于基于摄像头的Android应用,实时取景是一个基本前提,通过前置或后置摄像头持续获取捕获到的内容,可以进一步做处理(人脸检测.美颜.滤镜等). 所谓实时取景,简单说就是调用android的摄像头,把摄像头捕获的内容显示在apk的界面上.只要应用不关闭,相机就持续捕获,apk上看到的就是实时的取景了. 采用SurfaceView和Camera来做这件事. 是SDK自带的SurfaceView类而不是实现它的子类:在布局XML文件中使用SurfaceView而不是FrameLayout.因此,代

Android 简单的照相机程序的实例代码_Android

复制代码 代码如下: class surface extends SurfaceView implements SurfaceHolder.Callback {          SurfaceHolder sfholder;          Camera camera;          Bitmap bitmap;          public surface(Context context) {             super(context);             // TO

Android 简单的照相机程序的实例代码

复制代码 代码如下:class surface extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder sfholder; Camera camera; Bitmap bitmap; public surface(Context context) {             super(context);             // TODO Auto-generated constructor stub sf

surfaceview报错-Exception locking surface

问题描述 Exception locking surface Exception locking surface E/SurfaceHolder( 2306): java.lang.IllegalArgumentException E/SurfaceHolder( 2306): at android.view.Surface.lockCanvasNative(Native Method) E/SurfaceHolder( 2306): at android.view.Surface.lockCa

android技巧:SurfaceView的制作android游戏框架介绍

1.介绍 我们知道android游戏主要包含两方面.一方面是控制类,这个通过一些循环以及监听机制来实现.另一方面就是显示类.在现实类中最常见的就是view,view的机制比较适合刷新比较慢的应用,像是象棋之类的.本文要提到的SurfaceView是继承自view类.surfaceview的好处是可以随意控制对象的位置,大小等属性,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas() .下面就来介绍下surfaceview的结

Android SurfaceView游戏开发示例

当我们需要开发一个复杂游戏的时候,而且对程序的执行效率要求很高时,View类就不能满足需求了,这时必须用 SurfaceView类进行开发. 例如,对速度要求很高的游戏时,View类就不能满足需求了,这时必须使用SurfaceView类进 行开发.例如,对速度要求很高的游戏,可以使用双缓冲来显示.游戏中的背景.人物.动画等都需要绘制在一个画布(Canvas) 上,而SurfaceView可以直接访问一个画布,SurfaceView 是提供给需要直接画像素而不是使用窗体部件的应用使用的. 每个 S

Android SurfaceView学习示例

SurfaceView是View的子类,使用的方式与任何View所派生的类都是完全相同的,可以像其他View那样应用动画,并把它们放 到布局中. SurfaceView封装的Surface支持使用本章前面所描述的所有标准Canvas方法进行绘图,同时也支持完全的OpenGL ES库. 使用OpenGL,你可以再Surface上绘制任何支持的2D或者3D对象,与在2D画布上模拟相同的效果相比,这种方法可以依 靠硬件加速(可用的时候)来极大地提高性能. 对于显示动态的3D图像来说,例如,那些使用Go

Android SurfaceView的运用

下面就贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位 置 代码: Activity package com.view; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class MainActivity extends Acti

surfaceview详解

1.概念       SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图.它的特性是:可以在主线程之外的线程中向屏幕绘图上.这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度.在游戏开发中多用到SurfaceView,游戏中的背景.人物.动画等等尽量在画布canvas中画出. 2.实现方法 1)实现步骤     a.继承SurfaceView     b.实现SurfaceHolder.Callback接口 2)需