2012-09-04 25 views
11

ho creato una visualizzazione personalizzata CircleView come questo:Tela non disegna in visualizzazione personalizzata

public class CircleView extends LinearLayout { 

    Paint paint1; 
    public CircleView(Context context) { 
     super(context); 
     init(); 
    } 
    public CircleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 
    public void init() { 
     paint1 = new Paint(); 
     paint1.setColor(Color.RED); 
    }  
    protected void onDraw(Canvas canvas) { 
     //super.onDraw(canvas);   
     canvas.drawCircle(50, 50, 25, paint1); 
     this.draw(canvas); 
    } 
} 

Poi ho inserito sul mio radice il layout di attività <RelativeLayout>:

<com.turkidroid.test.CircleView 
     android:id="@+id/circle_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_centerInParent="true" /> 

Tuttavia, nulla è stato elaborato!

  • Sto implementando la vista personalizzata, giusto?
  • O è come ho usato la visualizzazione personalizzata?

Alcuni Info:

  • Sia CircleView e MyActivity sono nella stessa confezione: com.turkidroid.test.
  • Nel metodo onDraw(), ho provato a includere super.onDraw() e commentandolo.
  • So che posso disegnare un cerchio con approcci molto più semplici ma il mio CircleView sarà contenere più di un cerchio. Ho bisogno di renderlo una visualizzazione personalizzata.

risposta

27

Il metodo onDraw non viene mai chiamato, è necessario chiamare setWillNotDraw (false) sul costruttore della vista personalizzata per poter richiamare effettivamente l'oggettoDraw.

Come indicato su Android SDK:

Se questo punto di vista non fa qualsiasi disegno da sola, impostare questo flag per permettere ulteriori ottimizzazioni. Per impostazione predefinita, questo flag non è impostato su View, ma potrebbe essere impostato su alcune sottoclassi di View come ViewGroup. In genere, se si sostituisce onDraw (android.graphics.Canvas), è necessario deselezionare questo flag .

+0

Getta 'java.lang.StackOverflowError' dopo ho aggiunto il metodo per i costruttori! Qualche idea? – iTurki

+0

Il tuo suggerimento ha funzionato come un incantesimo dopo che ho 'non commentato super.onDraw()' dal mio codice. Grazie! – iTurki

+0

non sono sicuro di cosa fosse, la mia chiamata super.ondraw mancava e anche la flag sopra era impostata come predefinita, ma dopo aver inserito entrambe le cose, è successo !!^_^ –

0

Dove è il tuo metodo this.draw()?

Questo dovrebbe funzionare definitivamente:

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas);   
    canvas.drawCircle(50, 50, 25, paint1); 
    //this.draw(canvas); where is this method? 
} 
+0

'this.draw()' è il ['View.draw()'] (http: //developer.android.com/reference/android/view/View.html#draw%28android.graphics.Canvas%29) metodo. Ancora non ha funzionato! – iTurki

+0

Dopo aver aggiunto 'setWillNotDraw (false)' ai costruttori, funziona! Non so perché! – iTurki

+2

Se hai bisogno di una vista personalizzata, dovresti sempre estendere da Visualizza e non da LinearLayout a meno che tu non abbia davvero bisogno anche del comportamento specifico. – WarrenFaith

Problemi correlati