2014-09-21 8 views
6

Ich beginne mit meinen ersten Versuchen, eine Android-App zu schreiben. Ich möchte die Monte-Carlo-Approximation für Pi visualisieren. Daher möchte ich zuerst einen Kreis auf eine Ansicht zeichnen, aber ich bekomme es nicht funktionieren! Ich habe versucht, meine eigene „Circle“ Klasse zu schaffen, die hier „Ansicht“ und überschreiben die OnDraw (..) Methode, wie seine erklärte über sich: How to draw circle by canvas in Android?Zeichnen Sie einen Kreis auf eine Ansicht (Android)

Das ist meine Klasse Circle

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 „Rendering Probleme Benutzerdefinierte Ansicht Circle nicht die unter Verwendung von 2- oder: die Circle in eine Linearlayout mit dem folgenden XML-Code

<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 sagt mir, in der XML-Ansicht auf der rechten Seite eingefügt hat 3 -argument View-Konstruktoren; XML-Attribute wird nicht funktionieren ")

Die App einfach mit dem folgenden Protokoll abstürzt: http://pastebin.com/Gv1GaHtX

Kann jemand sagen, was ich falsch gemacht habe

Ich dachte, das Setup eine Aktivität im Hinblick schaffen würde, die anzeigt? ein Kreis

Grüße

Edit:. Absturz festgelegt, indem Sie die 2 und 3 Parameter Constructor in Circle (Siehe https://stackoverflow.com/a/13797457/3248708)

Aber jetzt noch nicht sehe ich jeden Kreis der Tätigkeit

+0

Sie im Editor oder auf dem Gerät jeden Kreis nicht sehen? –

+0

@DanielBo auf dem Gerät – Tak3r07

+0

Warum erstellen Sie keine Kreisform in XML und fügen Sie sie als Quelle zu einem ImageView hinzu? – joao2fast4u

Antwort

10

Ein paar Beobachtungen:

Sie müssen die Breite und Höhe berücksichtigen, um Ihre Ansicht zugewiesen, wenn der Kreis den Mittelpunkt und Radius bestimmen, .

Sie sollten das Padding berücksichtigen, das Ihrer Ansicht zugewiesen ist, sodass Sie nicht in diesem reservierten Teil zeichnen.

Sie sollten es vermeiden, Objekte innerhalb Ihrer onDraw-Methode zuzuordnen, da dies viel aufgerufen wird.

Damit Ihre Ansicht in einem XML-Layout angegeben werden kann, müssen Sie den Konstruktor angeben, der einen Context und ein AttributeSet verwendet. Das AttributeSet ist der Mechanismus, mit dem Ihre XML-Attribute an Ihre Ansicht übergeben werden.

Geben Sie diesen einen Versuch:

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

Danke, das zeichnet einen Kreis für mich. Ich werde mir das morgen genauer ansehen! – Tak3r07

+0

@MichaelKrause wie kann ich ontouch oder onclick event auf diesem kreis aktivieren? –

+0

@PranavMS Da CircleView in meinem obigen Beispiel eine View ist, können Sie die boolesche Methode onTouchEvent (MotionEvent event) überschreiben und/oder einen onClickListener hinzufügen, indem Sie setOnClickListener aufrufen (View.OnClickListener l) Eventuell müssen Sie setClickable aufrufen (true) , aber nicht sicher. –

Verwandte Themen