MainActivity如下:

package cn.testcleancanvas;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* 0 Surface和SurfaceView以及SurfaceHolder的认识及使用
* 1 Canvas清屏的实现
* 参考资料:

* 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;
/**
* 参考资料:

*
* 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;
/**
* 参考资料:

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