2012-06-23 92 views
0

我一直在開發應用程序繪製,並且有它下面的代碼:如何使用多線程在畫布上繪圖?

public class PainterView extends View implements DrawingListener { 

private Context context; 
private Painter painter; 
private Bitmap background; 
private Bitmap bitmap; 
private Paint bitmapPaint; 
private Path path; 
private Paint paint; 

private float x; 
private float y; 

public PainterView(Context context, Painter painter) { 

    super(context); 
    this.context = context; 
    this.painter = painter; 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    if (bitmap != null) { 
     canvas.drawBitmap(background, 0, 0, bitmapPaint); 
     canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); 
     canvas.drawPath(path, paint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     painter.touchStart(x, y); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     painter.touchMove(x, y); 
     break; 
    case MotionEvent.ACTION_UP: 
     painter.touchUp(); 
     break; 
    } 
    return true; 
} 

@Override 
public void onPictureUpdate(Bitmap background, Bitmap bitmap, Paint bitmapPaint, Path path, Paint paint) { 
    this.background=background; 
    this.bitmap = bitmap; 
    this.bitmapPaint = bitmapPaint; 
    this.path = path; 
    this.paint = paint; 
    invalidate(); 
} 

public void setPainter(Painter painter) { 
    this.painter = painter; 
} 
} 

此代碼捕獲所有觸摸事件,發送此事件的模型,這節省座標和發送的位圖來查看圖紙。

我正在使用此代碼,它工作良好,但我的客戶告訴我,繪圖不是在一些地方平滑地休息或失蹤。所以我需要爲它使用多線程。所以,請告訴我,我該怎麼做?或者我可以用另一種方式提高生產力?

回答

0

這裏是我是如何實現的基本骨架你想要什麼:

public class Drawing extends Activity implements OnTouchListener{ 

    DrawPanel dp; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     dp = new DrawPanel(this); 
     dp.setOnTouchListener(this); 
      // do other stuff you want 
      setContentView(dp); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     dp.pause(); 
    } 



    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     dp.resume(); 
    } 

    public class DrawPanel extends SurfaceView implements Runnable{ 

     Thread t = null; 
     SurfaceHolder holder; 
     boolean isItOk = false ; 

     public DrawPanel(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
      holder = getHolder(); 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(isItOk == true){ 

       if(!holder.getSurface().isValid()){ 
        continue; 
       } 

       Canvas c = holder.lockCanvas(); 
       c.drawARGB(255, 0, 0, 0); 
       onDraw(c); 
       holder.unlockCanvasAndPost(c); 
      } 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      // TODO Auto-generated method stub 
      super.onDraw(canvas); 
        // do your drawing stuff here 
      } 
     } 

     public void pause(){ 
      isItOk = false; 
      while(true){ 
       try{ 
        t.join(); 
       }catch(InterruptedException e){ 
        e.printStackTrace(); 
       } 
       break; 
      } 
      t = null; 
     } 

     public void resume(){ 
      isItOk = true; 
      t = new Thread(this); 
      t.start(); 

     } 




    } 


    @Override 
    public boolean onTouch(View v, MotionEvent me) { 
    // capture your coordinates here   
    return true; 

    } 


}