如何在另一个线程中绘制Canvas?

我一直在开发应用程序,我需要drawg在另一个线程中执行。 现在我的代码是:

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,那么应用程序可以在另一个线程中绘制,但它不起作用 – 当我绘制设备闪烁的屏幕时。 那么,请告诉我,如何使用multithreading来使用SurfaceHolder和其他元素进行绘制? 我需要在代码中尽可能少地进行更改。

您只能在主UI线程中绘制。 您应该使用SurfaceView,因为它专门用于支持从辅助线程绘图。

此类的目的之一是提供一个表面,其中辅助线程可以呈现到屏幕中。 如果您打算以这种方式使用它,您需要了解一些线程语义。

资源

另请参见此video: 学习Android教程1.28- SurfaceView简介