2 votes

Dessiner sur le canevas en superposition

Je dessine sur un Canvas dans un AsyncTask dans doInBackground. Le code de dessin s'exécute, vérifié pas à pas avec le débogage. La méthode onPostExecute() est également appelée, vérifié également. Cependant, rien n'est dessiné ? Je peux confirmer que le code de dessin est correct, puisque la même logique s'est exécutée précédemment à l'intérieur de la méthode onDraw() d'une sous-classe de Overlay. Voici la source :

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 {

    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 ).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;
        // au moins 2 éléments dans 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( ".", "" ) ) );
                }
                // projeter le point
                projection = mMapView.getProjection();
                Point projectedPoint = new Point();
                projectedPoint = projection.toPixels( geoPoint, projectedPoint );
                // dessiner le 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 );
        }
    }
}

1voto

Romain Guy Points 57114

Tout ce que vous dessinez avec un Canvas est en fait dessiné sur le Bitmap que vous avez défini sur ce Canvas. Le Bitmap que vous utilisez n'est référencé que dans doInBackground() et nulle part ailleurs. Ce que votre superposition doit faire est de dessiner le bitmap :

@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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X