Android 如何清空Canvas ?(找了好久的答案)

yangxi_001發表於2013-12-25

Android 如何清空 Canvas ?

似乎一直未找到好的解決辦法,有的方法限制使用純色背景,但無論怎麼嘗試,都未見效果,

終於在 http://stackoverflow.com/questions/4650755/clearing-canvas-with-canvas-drawcolor  上面找到了答案:



經過嘗試,結果如下:

     

之前的不理想圖片                     想要的效果


(注,圖示方向為最頂層)


此類如下:

[java] view plaincopy
  1. package com.test.move;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Canvas;  
  7. import android.graphics.Paint;  
  8. import android.graphics.PorterDuff.Mode;  
  9. import android.graphics.PorterDuffXfermode;  
  10. import android.util.AttributeSet;  
  11. import android.view.SurfaceHolder;  
  12. import android.view.SurfaceHolder.Callback;  
  13. import android.view.SurfaceView;  
  14.   
  15. import com.test.R;  
  16.   
  17. public class GlobalMove extends SurfaceView implements Callback, Runnable {  
  18.     public final static String TAG = "GlobalMove";    
  19.     public static int count = 0;  
  20.       
  21.     private boolean bSurfaceRun = true;  
  22.     private SurfaceHolder sh;  
  23.     private Thread         th;  
  24.     private Paint               p;     
  25.     private Canvas          canvas;    
  26.       
  27.     //objects to be moved...  
  28.     private Bitmap bmp;  
  29.     private int lastX = 0;  
  30.       
  31.   
  32.     public GlobalMove(Context context, AttributeSet attrs) {//這種寫法。。。  
  33.         super(context, attrs);  
  34.         sh = this.getHolder();  
  35.         sh.addCallback(this);  
  36.         th = new Thread(this);  
  37.         p = new Paint();  
  38.           
  39.         initComponents(context);          
  40.     }  
  41.       
  42.     private void initComponents(Context context){  
  43.         bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);   
  44.     }  
  45.   
  46.     private void draw(){  
  47.         canvas = sh.lockCanvas();  
  48.         if(canvas != null)  {     
[java] view plaincopy
  1. //取消如下四行註釋看效果。  
  2. //          Paint paint = new Paint();  
  3. //          paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));  
  4. //          canvas.drawPaint(paint);  
  5. //          paint.setXfermode(new PorterDuffXfermode(Mode.SRC));  
  6.           
  7.             canvas.drawBitmap(bmp, lastX+1050, p);  
  8.         }  
  9.           
  10.         lastX += 10;  
  11.         if(lastX > 400)  
  12.             lastX = 0;  
  13.                   
  14.         sh.unlockCanvasAndPost(canvas);  
  15.     }  
  16.       
  17.     @Override  
  18.     public void run() {  
  19.         while(bSurfaceRun){           
  20.             draw();  
  21.               
  22.             try{  
  23.                 Thread.sleep(100);  
  24.             } catch(InterruptedException  e){  
  25.                 e.printStackTrace();                  
  26.             }  
  27.         }  
  28.     }  
  29.   
  30.   
  31. ///////////////////////////////////////////////////////////////////////////////////////////////////  
  32.     @Override  
  33.     public void surfaceCreated(SurfaceHolder holder) {  
  34.         th.start();  
  35.     }  
  36.     @Override  
  37.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  38.             int height) {  
  39.     }  
  40.     @Override  
  41.     public void surfaceDestroyed(SurfaceHolder holder) {  
  42.         bSurfaceRun = false;  
  43.     }   
  44.   
  45. }  

相關文章