2013-03-04 3 views
2

Я рисую на холсте в AsyncTask в doInBackground. Прорисовывается код чертежа, проверяется его поэтапная отладка. Также вызывается метод onPostExecute(), также проверенный. Однако ничего не делается? Я могу подтвердить, что код чертежа верен, поскольку одна и та же логика ранее выполнялась внутри метода onDraw() подкласса Overlay. Вот источник:Рисунок Холст к Overlay

import java.lang.ref.WeakReference; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Point; 
import android.os.AsyncTask; 

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.Projection; 

public class AsyncOverlayTask extends AsyncTask<DataVO, Void, Canvas> { 

    private final Paint  mPathPaint; 
    private final Paint  mPointPaint; 
    private Path   path; 
    private final MapView mMapView; 
    private final Canvas mCanvas; 

    public AsyncOverlayTask(final MapView mapView, final Paint pathPaint, final Paint pointPaint) { 

     mMapView = new WeakReference<MapView>(mapView).get(); 
     mPathPaint = pathPaint; 
     mPointPaint = pointPaint; 
     mCanvas = new Canvas();  
    } 

    @Override 
    protected Canvas doInBackground(final DataVO... params) { 
     Thread.currentThread().setName("AsyncOverlayTask"); 
     final Canvas canvas = new Canvas(); 
     final Bitmap bitmap = Bitmap.createBitmap(mMapView.getWidth(), mMapView.getHeight(), Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 
     canvas.drawColor(Color.TRANSPARENT); 
     GeoPoint previousGeoPoint = null; 
     GeoPoint geoPoint = null; 
     final Path path = new Path(); 
     Projection projection; 
     // at least 2 elements in aData 
     if ((params != null) && (params.length > 0)) { 
      for (final DataVO dataVo : params) { 
       if (dataVo.getLatitude().replace(".", "").length() > 8) { 
        geoPoint = new GeoPoint(Integer.valueOf(dataVo.getLatitude().replace(".", "").substring(0, 8)), Integer.valueOf(dataVo 
          .getLongitude().replace(".", "").substring(0, 7))); 
       } else { 
        geoPoint = new GeoPoint(Integer.valueOf(dataVo.getLatitude().replace(".", "")), Integer.valueOf(dataVo.getLongitude() 
          .replace(".", ""))); 
       } 
       // project point 
       projection = mMapView.getProjection(); 
       Point projectedPoint = new Point(); 
       projectedPoint = projection.toPixels(geoPoint, projectedPoint); 
       // draw point 
       canvas.drawCircle(projectedPoint.x, projectedPoint.y, 7, mPointPaint); 
       if (previousGeoPoint != null) { 
        final Point prevPoint = new Point(); 
        projection.toPixels(previousGeoPoint, prevPoint); 
        // if((projectedPoint.x != prevPoint.x) && 
        // (projectedPoint.y != projectedPoint.y)) { 
        path.moveTo(projectedPoint.x, projectedPoint.y); 
        path.lineTo(prevPoint.x, prevPoint.y); 
        canvas.drawPath(path, mPathPaint); 
        // } 
       } else { 
        path.moveTo(projectedPoint.x, projectedPoint.y); 
       } 
       previousGeoPoint = geoPoint; 
      } 

     } 
     return canvas; 

    } 

    @Override 
    protected void onPostExecute(final Canvas canvas) { 
     if ((mMapView != null) && (canvas != null)) { 
      final DataOverlay dataOverlay = new DataOverlay(); 
      dataOverlay.draw(canvas, mMapView, false); 
      if (mMapView != null) { 
       mMapView.getOverlays().add((dataOverlay)); 
       mMapView.invalidate(); 
      } 
     } 
    } 

    private class DataOverlay extends Overlay { 

     @Override 
     public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { 
      super.draw(canvas, mapView, shadow); 
     } 
    } 
} 
+0

У меня есть ключ. mMapview.getWidth() и getHeight() возвращают -1 ... –

ответ

1

Все рисование с Canvas фактически обращается на Bitmap вы установили на этом Canvas. Используемый вами номер Bitmap ссылается только на doInBackground() и нигде больше. То, что вам нужно сделать, это нарисовать растровое изображение:

@Override 
protected Bitmap doInBackground(final DataVO... params) { 
    return bitmap; 
} 

@Override 
protected void onPostExecute(final Canvas canvas) { 
    // ... 
    final DataOverlay dataOverlay = new DataOverlay(bitmap); 
    // ... 
} 

private class DataOverlay extends Overlay { 
    private final Bitmap mBitmap; 

    DataOverlay(Bitmap b) { mBitmap = b; } 

    @Override 
    public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { 
     canvas.drawBitmap(b, 0.0f, 0.0f, null); 
    } 
} 
+0

Звучит разумно. О том, чтобы попробовать это. Остается только проблема, что MapView.getWidth() и MapView.getHeight() всегда возвращают 0.0, в то время как MapView был создан. Я где-то читал, что можно получить значения кортежа только в том случае, когда/после вызова метода MapViews onDraw(). Однако я хочу расширить MapView только для получения этих значений. Кто-нибудь знает лучший подход? –

+0

Вам нужно подождать, пока после первого макета не появится правильная ширина и высота. Вы можете использовать View.getViewTreeObserver() для этой цели. –

+0

Ну, я создаю экземпляр этого класса после первого макета. Это похоже на: onCreate (bind views) -> onStart -> onResume (добавить MyLocationOverlay и другие вещи) -> сделать больше всего -> AsyncOverlayTask.execute() –

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