zoukankan      html  css  js  c++  java
  • Surface和SurfaceView以及SurfaceHolder的认识及使用

    MainActivity如下:

    package cn.testcleancanvas;
    import android.os.Bundle;
    import android.app.Activity;
    /**
     * Demo描述:
     * 0 Surface和SurfaceView以及SurfaceHolder的认识及使用
     * 1 Canvas清屏的实现
     * 参考资料:
     * 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的方法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);
    		}
    	}
    	
    	//以下三个方法为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>



     

  • 相关阅读:
    序列化流与反序列化流
    io流之Properties类
    io流之转换流与缓冲流
    Io流之File概述(递归/字节流/字符流)
    基本数据类型包装/System类/Math类/Arrays类
    Date类概述与Calendar类概念
    String类型概述
    20180926 小小插件 (弹窗)
    20180901 文件加载 错误处理 错误的触发
    20180828 优化留言板 功能(增加 删除 修改 查看)!
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3132118.html
Copyright © 2011-2022 走看看