2012-06-29 58 views
2

我一直在開發應用程序,我需要drawingg在另一個線程中執行。現在我的代碼是:如何在畫布上繪製另一個線程?

public class PainterView extends View implements DrawingListener { 

    //private GestureDetector detector; 
    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; 

    private boolean isErasing=false; 
    private boolean isTextDrawing=false; 

    private ExecutorService pool; 

    public PainterView(Context context, Painter painter) { 

     super(context); 
     this.context = context; 
     this.painter = painter; 
     pool=Executors.newFixedThreadPool(3); 
     //detector = new GestureDetector(context, new GestureListener()); 
    } 

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

    @Override 
    protected void onDraw(final Canvas canvas) { 
     if (bitmap != null) { 
      pool.submit(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        synchronized (PainterView.this) { 
         canvas.drawBitmap(background, 0, 0, bitmapPaint); 
         canvas.drawBitmap(bitmap, 0, 0, bitmapPaint); 
         canvas.drawPath(path, paint); 
        } 
       } 

      }); 

     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     //detector.onTouchEvent(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; 
    } 
} 

我想,如果我使用的ExecutorService那麼應用程序可以在另一個線程畫,但它不工作 - 當我畫設備blinkes的屏幕。所以,請告訴我,如何使用多線程進行使用SurfaceHolder和其他元素的繪圖?我需要儘可能少地改變我的代碼。

+0

這是爲Android?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)(它會顯示導入)。 –

+0

如果你只是刪除'pool.submit(new Runnable',使繪圖直接在'onDraw'中發生什麼? – weston

+0

不,我需要在另一個線程中繪製,但如果我不使用submit,那麼它會贏得在另一個線程中工作 – user1477886

回答

0

您只能在主UI線程中繪製。您應該使用SurfaceView,因爲它專門用於支持從輔助線程繪圖。

該類的目的之一是提供一個表面,其中 輔助線程可以呈現在屏幕中。如果你打算這樣使用 ,你需要知道一些線程語義。

source

也看到這部影片:Learn Android Tutorial 1.28- Introduction to the SurfaceView

+0

所以,如果我使用SurfaceView,它將在另一個線程中執行,或者我將獲得哪些好處? – user1477886

+0

如果使用曲面視圖,可以從中抓取畫布並從輔助線程(你的executorservice)觀看一個視頻,有一些例子 –

+0

非常感謝,我會去嘗試一下 – user1477886