2012-07-15 14 views
5

Sto tentando di disegnare una linea in una personalizzata View. Qui ho creato un semplice Path con un solo segmento, creato uno PathShape da quello e infine inserito in uno ShapeDrawable con l'intenzione di utilizzarlo per disegnare sullo all'interno dello Canvas. Tuttavia, questo non funziona. Vedi il mio esempio, qui.Come si dovrebbe usare ShapeDrawable con PathShape per tracciare una linea su una vista personalizzata?

package com.example.test; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.drawable.ShapeDrawable; 
import android.graphics.drawable.shapes.PathShape; 
import android.util.Log; 
import android.view.View; 

public class TestView extends View { 

    private Path mPath = null; 
    private Paint mPaint = null; 
    private PathShape mPathShape = null; 
    private ShapeDrawable mShapeDrawable = null; 

    public TestView(Context context) { 
     super(context); 
    } 

    private void init() { 
     int width = this.getWidth()/2; 
     int height = this.getHeight()/2; 

     Log.d("init", String.format("width: %d; height: %d", width, height)); 

     this.mPath = new Path(); 
     this.mPath.moveTo(0, 0); 
     this.mPath.lineTo(width, height); 

     this.mPaint = new Paint(); 
     this.mPaint.setColor(Color.RED); 

     this.mPathShape = new PathShape(this.mPath, 1, 1); 

     this.mShapeDrawable = new ShapeDrawable(this.mPathShape); 
     this.mShapeDrawable.getPaint().set(this.mPaint); 
     this.mShapeDrawable.setBounds(0, 0, width, height); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
     super.onLayout(changed, left, top, right, bottom); 

     // Doing this here because in the constructor we don't have the width and height of the view, yet 
     this.init(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     Log.d("onDraw", "Drawing"); 

     // This works, but won't let me do what I'm really trying to do 
     canvas.drawLine(0.0f, 0.0f, this.getWidth()/2.0f, this.getHeight()/2.0f, this.mPaint); 

     // This should work, but does not 
     //this.mPathShape.draw(canvas, this.mPaint); 

     // This should work, but does not 
     //this.mShapeDrawable.draw(canvas); 
    } 

} 

Come si può vedere dai miei commenti nel metodo onDraw(), né utilizzando il PathShape né la ShapeDrawable per disegnare la Path sul Canvas funziona realmente. Nulla è disegnato quando ci provo. Qualcuno ha qualche idea del perché?

Il dispositivo su cui sto eseguendo il test funziona con Android 4.1.1.

+0

Solo curioso: hai provato a creare un nuovo oggetto Paint all'interno di onDraw. Lo sto facendo e ho avuto successo con le bitmap ma non ero sicuro se fosse necessario o meno. – JavaCoderEx

+0

Non avevo, dal momento che non volevo creare oggetti in onDraw (in realtà causa un avvertimento da Lint). Tuttavia, l'ho provato proprio ora e ho ottenuto gli stessi risultati. Nessun successo. – Daniel

+0

Dopo alcune ulteriori indagini e la mancanza di risposta qui, penso che questo sia semplicemente rotto e ho inviato una segnalazione di bug. http://code.google.com/p/android/issues/detail?id=35229 – Daniel

risposta

12

Ci sono due problemi con questo.

Il primo è lo stile Paint. L'impostazione predefinita è Paint.Stroke.FILL, ma con una riga non c'è nulla da riempire. Ho bisogno di aggiungere questo (grazie, Romain Guy):

this.mPaint.setStyle(Paint.Style.STROKE); 

Il secondo problema è che l'altezza standard e larghezza nella PathShape non è corretta. Avevo letto the documentation su questo, ma non ho capito bene. Ciò è diventato evidente una volta risolto il primo problema. Impostandolo all'altezza e alla larghezza della mia vista personalizzata (poiché sto disegnando sull'intera vista) ho risolto questo problema. Ho anche dovuto cambiare i limiti del ShapeDrawable per abbinare.

this.mPathShape = new PathShape(this.mPath, this.getWidth(), this.getHeight()); 

e

this.mShapeDrawable.setBounds(0, 0, this.getWidth(), this.getHeight()); 

Speriamo che questo aiuta qualcun altro in futuro.

+0

Grazie per questo! Ho avuto esattamente gli stessi problemi. –

+1

Un altro problema che può causare la mancata visualizzazione è se le dimensioni del tuo percorso sono più grandi del tuo rapporto massimo, il che si traduce in avvisi nel tuo LogCat. –