2014-09-21 1 views
6

Sto iniziando con i miei primi tentativi di scrivere un'app per Android. Mi piacerebbe visualizzare il Monte-Carlo-Approssimazione per pi. Quindi prima voglio disegnare un cerchio su una vista, ma non lo faccio funzionare! Ho cercato di creare il mio Classe "CircleView" che si estende "Visualizza" e sovrascrivere il metodo OnDraw (..) come la sua spiegato qui: How to draw circle by canvas in Android?Disegna un cerchio su una vista (Android)

Questa è la mia classe CircleView

public class CircleView extends View { 
    public CircleView(Context context) { 
     super(context); 
    } 

    protected void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     Paint paint = new Paint(); 
     paint.setColor(150); 
     canvas.drawCircle(50,50,20,paint); 
    } 
} 

I hanno inserito il CircleView in un LinearLayout con il seguente codice XML-codice

<com.tak3r07.montecarlopi.CircleView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/circleView" 
    android:layout_weight="1"/> 

(Btw Android Studio mi sta dicendo in XML-view sul lato destro: "problemi di rendering personalizzato CircleView non sta usando il 2 o 3 -argument Mostra costruttori; attributi XML non funziona ")

L'App appena si blocca con il seguente registro: http://pastebin.com/Gv1GaHtX

Può qualcuno dire che cosa ho fatto di sbagliato

ho pensato che questa messa a punto creerebbe un'attività con una vista che mostra? un cerchio

saluti

Edit:. Crash è fissato con l'aggiunta del Costruttore 2 e 3 parametri in CircleView (Vedi https://stackoverflow.com/a/13797457/3248708)

Ma ora io ancora non vedo alcuna Circle nell'attività

+0

tu non vedere alcun cerchio nell'editor o sul dispositivo? –

+0

@DanielBo sul dispositivo – Tak3r07

+0

Perché non si crea una forma circolare in XML e la si aggiunge come sorgente a un ImageView? – joao2fast4u

risposta

10

Un paio di osservazioni:

È necessario prendere in considerazione la larghezza e l'altezza assegnato alla vista quando si determina il punto centrale del cerchio e il raggio .

È necessario prendere in considerazione il riempimento assegnato alla vista in modo da non disegnare in quella parte riservata.

Evitare di allocare oggetti nel metodo onDraw poiché questo viene chiamato molto.

Per consentire la visualizzazione della vista in un layout XML, è necessario fornire il costruttore che accetta un Contesto e un AttributeSet. L'AttributeSet è il meccanismo mediante il quale i tuoi attributi XML vengono passati alla tua vista.

dare una prova:

package com.tak3r07.montecarlopi; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.View; 

public class CircleView extends View 
{ 
    private static final int DEFAULT_CIRCLE_COLOR = Color.RED; 

    private int circleColor = DEFAULT_CIRCLE_COLOR; 
    private Paint paint; 

    public CircleView(Context context) 
    { 
     super(context); 
     init(context, null); 
    } 

    public CircleView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) 
    { 
     paint = new Paint(); 
     paint.setAntiAlias(true); 
    } 

    public void setCircleColor(int circleColor) 
    { 
     this.circleColor = circleColor; 
     invalidate(); 
    } 

    public int getCircleColor() 
    { 
     return circleColor; 
    } 

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

     int w = getWidth(); 
     int h = getHeight(); 

     int pl = getPaddingLeft(); 
     int pr = getPaddingRight(); 
     int pt = getPaddingTop(); 
     int pb = getPaddingBottom(); 

     int usableWidth = w - (pl + pr); 
     int usableHeight = h - (pt + pb); 

     int radius = Math.min(usableWidth, usableHeight)/2; 
     int cx = pl + (usableWidth/2); 
     int cy = pt + (usableHeight/2); 

     paint.setColor(circleColor); 
     canvas.drawCircle(cx, cy, radius, paint); 
    } 
} 
+0

Grazie, questo mi disegna un cerchio. Domani avrò uno sguardo più approfondito su questo! – Tak3r07

+0

@MichaelKrause come posso abilitare onuch o onclick su questo cerchio? –

+0

@PranavMS Poiché CircleView è una visualizzazione nell'esempio precedente, è possibile sovrascrivere il metodo booleano onTouchEvent (evento MotionEvent) e/o aggiungere un onClickListener su di esso chiamando setOnClickListener (View.OnClickListener l) Potrebbe essere necessario chiamare setClickable (true) ma non sono sicuro. –