Surface和SurfaceView以及SurfaceHolder的认识及使用
来源:互联网 发布:iphone usb共享网络 编辑:程序博客网 时间:2024/06/05 17:51
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;@Overrideprotected 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的SurfaceHoldermSurfaceHolder=this.getHolder();//为SurfaceHolder设置回调mSurfaceHolder.addCallback(this);mDrawMovingImageThread=new DrawMovingImageThread();mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);}//开启线程不断地绘制Bitmapprivate class DrawMovingImageThread extends Thread{@Overridepublic 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接口的实现@Overridepublic void surfaceCreated(SurfaceHolder arg0) { mDrawMovingImageThread.start();}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic 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);}//开启线程不断地绘制Bitmapprivate class DrawMovingImageThread extends Thread{@Overridepublic 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);}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mDrawMovingImageThread.start();}//以下三个方法为android.view.SurfaceHolder.Callback接口的实现@Overridepublic void surfaceCreated(SurfaceHolder holder) {//调用SurfaceView的onDraw()方法onDraw(null);}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic 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>
- Surface和SurfaceView以及SurfaceHolder的认识及使用
- Surface, SurfaceView和SurfaceHolder
- Surface、SurfaceView和SurfaceHolder的理解
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系 .
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系
- 【Linux基础】shell控制结构
- Windows XP硬盘安装Ubuntu 12.04双系统图文详解
- mysql 无法进行远程访问的问题
- 众核指令数据加载
- 学科起源(漫画版)
- Surface和SurfaceView以及SurfaceHolder的认识及使用
- C语言宏定义##连接符和#符的使用
- 动态加载样式(css)文件
- OpenCv视频图像肤色检测
- 你的手机上未安装应用程序”的解决方案
- DOM24---表单验证的应用
- 【Linux基础】shell函数
- shell 递归调用实例
- Android开发者必知的开发资源