2012-06-29 3 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 (новый Runnable', чтобы рисунок произошел непосредственно в' onDraw'? – weston

+0

Нет, мне нужно рисовать в другом потоке. Но если я не буду использовать submit, он выиграет 't работать в другом потоке – user1477886

ответ

0

Вы можете использовать только основной поток пользовательского интерфейса. Вы должны использовать SurfaceView, поскольку он был специально создан для поддержки чертежа из вторичных потоков.

Одна из целей этого класса заключается в том, чтобы обеспечить поверхность, на которой вторичная резьба может визуализироваться на экране. Если вы собираетесь использовать так, вам нужно знать некоторую семантику потоков.

source

Смотрите также видео: Learn Android Tutorial 1.28- Introduction to the SurfaceView

+0

Итак, если я использую SurfaceView, он будет выполнен в другом потоке или который принесет пользу, я получу? – user1477886

+0

Если вы используете поверхностный вид, вы можете взять с него холст и нарисовать его из вторичной нити (ваш исполнительный сервис). Посмотрите видео, есть примеры –

+0

Большое спасибо. Я собираюсь попробовать. – user1477886

Смежные вопросы