2013-07-27 5 views
1

Я использую async задачу рисовать растровое изображение, но ничего не нарисовать!
это код AsyncTaskuse canvas.drawBitmap в AsyncTask onPostExecute

class BitmapWorker extends AsyncTask<String, Void, Void> 
{ 

    private Canvas canvas; 
    private Rect rcText; 
    private Paint paint; 
    private Options options; 
    private Options opt; 
    public BitmapWorker(Canvas canvas,Rect rcText,Paint paint) 
    { 
     this.canvas = canvas; 
     this.rcText = rcText;//the bitmap must draw on it's rect 
     this.paint = paint; 
    } 

    @Override 
    protected Void doInBackground(String... params) 
    { 
     options = new Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(m_AttachSource, options); 
     opt = new Options(); 
     opt.inPurgeable = true; 
     opt.inSampleSize = calculateInSampleSize(options, INSAMPLESIZE_THIMBPIC_WIDTH, INSAMPLESIZE_THIMBPIC_HEIGHT); 

     LoadThumbPic(m_AttachSource, opt); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result); 
     Boolean hasBitmap = false; 
     while(!hasBitmap) 
     { 
      if(m_PictureMessageTumbPic.get() != null) 
      { 
       canvas.drawBitmap(m_PictureMessageTumbPic.get(), null, rcText, paint); 
       hasBitmap = true; 
      } 
      else 
      { 
       Options opt = new Options(); 
       opt.inPurgeable = true; 
       opt.inSampleSize = calculateInSampleSize(options, INSAMPLESIZE_THIMBPIC_WIDTH, INSAMPLESIZE_THIMBPIC_HEIGHT); 
       LoadThumbPic(m_AttachSource, opt); 
       canvas.drawBitmap(m_PictureMessageTumbPic.get(), null, rcText, paint); 
       hasBitmap = true; 
      } 
     } 
    } 
} 

Тпх 4 нареч.

ответ

2

Вы сказали, что используете чертеж, но из вашего кода, похоже, что после операции рисования у вас нет . Поэтому вам нужно изменить AsyncTask, чтобы взять в View, и вызвать его метод invalidate() после того, как вы обновили Canvas.

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

Попробуйте это (не запускать код, может иметь глупые ошибки):

class BitmapWorker extends AsyncTask<String, Void, Void> 
{ 

    private Canvas canvas; 
    private Rect rcText; 
    private Paint paint; 
    private Options options; 
    private Options opt; 
    private View view; 
    public BitmapWorker(Canvas canvas,Rect rcText,Paint paint, View view) 
    { 
     this.canvas = canvas; 
     this.rcText = rcText;//the bitmap must draw on it's rect 
     this.paint = paint; 
     this.view = view; 
    } 

    @Override 
    protected Void doInBackground(String... params) 
    { 
     options = new Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(m_AttachSource, options); 
     opt = new Options(); 
     opt.inPurgeable = true; 
     opt.inSampleSize = calculateInSampleSize(options, INSAMPLESIZE_THIMBPIC_WIDTH, INSAMPLESIZE_THIMBPIC_HEIGHT); 

     LoadThumbPic(m_AttachSource, opt); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result); 
     Boolean hasBitmap = false; 
     while(!hasBitmap) 
     { 
      if(m_PictureMessageTumbPic.get() != null) 
      { 
       canvas.drawBitmap(m_PictureMessageTumbPic.get(), null, rcText, paint); 
       hasBitmap = true; 
      } 
      else 
      { 
       Options opt = new Options(); 
       opt.inPurgeable = true; 
       opt.inSampleSize = calculateInSampleSize(options, INSAMPLESIZE_THIMBPIC_WIDTH, INSAMPLESIZE_THIMBPIC_HEIGHT); 
       LoadThumbPic(m_AttachSource, opt); 
       canvas.drawBitmap(m_PictureMessageTumbPic.get(), null, rcText, paint); 
       hasBitmap = true; 
      } 
     } 

     if(hasBitmap) { 
      view.invalidate(); 
     } 
    } 
} 
+0

так, как я могу помешать продолжить игру AsyncTask когда ТЕРЯЕТСЯ взгляды? –

+0

Извините ... Я действительно понимаю, что вы имеете в виду, но я обновляю свой ответ, чтобы включить пример кода, который можно попробовать за несколько минут – Kai

+0

, если я использую invalidate, это ясно представление и должно использовать canvas.DrawBtmap снова нарисовать растровое изображение на нем, правильно? –

1

Сделать это на методе onPostExecute:

  • Получить держатель поверхности.
  • Инициализировать холст от держателя.
  • Сделайте держатель разблокировать ваш холст и опубликовать холст.
protected void onPostExecute(Bitmap result) { 

    SurfaceHolder holder = getSurfaceHolder(); 
    Canvas canvas = null; 

    try { 
     canvas = holder.lockCanvas(); 
     if (canvas != null) { 
      canvas.drawBitmap(result, 50, 50, paint); 
     } 

    } finally { 
     if (canvas != null) 
      holder.unlockCanvasAndPost(canvas); 
    } 
}