2014-09-21 17 views
6

Zaczynam od pierwszych prób napisania aplikacji na Androida. Chciałbym wizualizować przybliżenie Monte-Carlo dla pi. Dlatego najpierw chcę narysować kółko na widoku, ale nie działa! Próbowałem stworzyć własną klasę "CircleView", który rozciąga się "Widok" i zastąpić metodę OnDraw (..) jak jej wytłumaczyć tutaj: How to draw circle by canvas in Android?Narysuj okrąg na widoku (Android)

To moja klasa 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 włożono CircleView w LinearLayout z następującym kodem XML

<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 mówi mi w XML-view po prawej stronie: „Rendering Problemy niestandardowy widok CircleView nie korzysta z 2- lub 3 -argument Wyświetl konstruktory; Atrybuty XML nie będzie działać ")

App tylko wywala się z następującym log: http://pastebin.com/Gv1GaHtX

Może ktoś powiedzieć, co zrobiłem źle

Myślałem, ta konfiguracja będzie utworzyć działanie z myślą który wyświetla? okrąg

Pozdrowienia

Edit. Zawieszenie jest ustalana przez dodanie konstruktora 2 i 3 parametr w CircleView (Patrz https://stackoverflow.com/a/13797457/3248708)

Ale teraz ja nadal nie widzę żadnego okręgu w działalności

+0

nie widzisz żadnych koło w edytorze lub na urządzeniu? –

+0

@ Danielan na urządzeniu – Tak3r07

+0

Dlaczego nie utworzysz kształtu koła w XML i dodasz go jako źródło do ImageView? – joao2fast4u

Odpowiedz

10

Kilka uwag:

Trzeba wziąć pod uwagę szerokość i wysokość przypisany do widzenia przy określaniu punktu środkowego kręgu i promień .

Powinieneś wziąć pod uwagę dopełnienie przypisane do widoku, aby nie narysować tej zarezerwowanej części.

Powinieneś unikać przydzielania obiektów w swojej metodzie onDraw, ponieważ jest to często wywoływane.

Aby umożliwić określanie widoku w układzie XML, należy podać konstruktor, który przyjmuje kontekst i atrybut. AttributeSet to mechanizm, za pomocą którego atrybuty XML są przekazywane do widoku.

spróbuj tego:

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

Dziękuję, to rysuje koło dla mnie. Wczoraj przyjrzę się temu głębiej! – Tak3r07

+0

@MichaelKrause Jak mogę włączyć zdarzenie ontouch lub onclick w tym kręgu? –

+0

@PranavMS Ponieważ CircleView to widok w moim przykładzie powyżej, można zastąpić metodę boolean onTouchEvent (MotionEvent) i/lub dodać onClickListener na niej przez wywołanie metody setOnClickListener (View.OnClickListener l) Może być konieczne wywołanie metody setClickable (true) , ale, nie pewne. –