• 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>



     

  • 相关阅读:
    B1005 继续(3n+1)猜想 (25分)
    B1091 N-自守数 (15分)
    B1086 就不告诉你 (15分)
    B1081 检查密码 (15分)
    个人博客作业Week1
    2015个人项目(修改除法要求)
    2014个人博客列表
    最佳个人博客、团队博客评分
    最终评审时间确定
    最终复审要求
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3132118.html
Copyright © 2020-2023  润新知