2012-06-29 57 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