Android 如何清空 Canvas ?
似乎一直未找到好的解決辦法,有的方法限制使用純色背景,但無論怎麼嘗試,都未見效果,
終於在 http://stackoverflow.com/questions/4650755/clearing-canvas-with-canvas-drawcolor 上面找到了答案:
經過嘗試,結果如下:
之前的不理想圖片 想要的效果
(注,圖示方向為最頂層)
此類如下:
package com.test.move;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.util.AttributeSet;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import com.test.R;public class GlobalMove extends SurfaceView implements Callback, Runnable {public final static String TAG = "GlobalMove";public static int count = 0;private boolean bSurfaceRun = true;private SurfaceHolder sh;private Thread th; private Paint p; private Canvas canvas; //objects to be moved...private Bitmap bmp;private int lastX = 0;public GlobalMove(Context context, AttributeSet attrs) {//這種寫法。。。super(context, attrs);sh = this.getHolder();sh.addCallback(this);th = new Thread(this);p = new Paint();initComponents(context);}private void initComponents(Context context){bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon); }private void draw(){canvas = sh.lockCanvas();if(canvas != null){
//取消如下四行注釋看效果。//Paint paint = new Paint();//paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));//canvas.drawPaint(paint);//paint.setXfermode(new PorterDuffXfermode(Mode.SRC));canvas.drawBitmap(bmp, lastX+10, 50, p);}lastX += 10;if(lastX > 400)lastX = 0;sh.unlockCanvasAndPost(canvas);}@Overridepublic void run() {while(bSurfaceRun){draw();try{Thread.sleep(100);} catch(InterruptedException e){ e.printStackTrace(); }}}///////////////////////////////////////////////////////////////////////////////////////////////////@Overridepublic void surfaceCreated(SurfaceHolder holder) {th.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {bSurfaceRun = false;} }