2014-09-21 30 views
6

Bir android uygulaması yazmak için ilk denemelerimle başlıyorum. Pi için Monte-Carlo-Yaklaşımını görselleştirmek isterim. Bu yüzden önce bir manzaraya bir çember çizeceğim ama işe yaramayacağım! Ben onun buraya açıkladı gibi onDraw (..) yöntemini "Görünüm" uzanır kendi "CircleView" Class oluşturmak ve üzerine çalıştık: How to draw circle by canvas in Android?Bir görünüm üzerine bir daire çizin (android)

Bu benim CircleView Sınıfı olan

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 Sorunları Özel görünüm CircleView 2- ya kullanmıyor:

<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 sağ tarafında XML görünümünde beni anlatıyor aşağıdaki XML-koduyla bir LinearLayout içine CircleView ekledikten 3 -argument Kurucuları görüntüle; XML nitelikleri) "çalışmayacaktır

App sadece aşağıdaki günlüğüne çöker

: http://pastebin.com/Gv1GaHtX

birisi ben yanlış yaptığını söyleyebilir

Bu kurulum görüntüleyen bir bakış açısıyla bir etkinlik oluşturmak düşündüm? bir daire

Selamlar

Düzenleme:. kilitlenme CircleView 2 ve 3 Parametre Oluşturucu eklenerek sabitlenir (https://stackoverflow.com/a/13797457/3248708 bakınız)

Ama şimdi yine aktivite

+0

Düzenleyicide veya cihazda herhangi daire görmüyorum:

bu bir deneyin? –

+0

@DanielBo cihazda – Tak3r07

+0

Neden XML'de bir daire şekli oluşturmuyorsunuz ve bunu bir ImageView'a kaynak olarak eklemiyorsunuz? – joao2fast4u

cevap

10

gözlemler Birkaç herhangi Çemberi görmüyorum:

Sen hesaba çemberin merkez noktası ve yarıçap belirlerken görünümünüze atanan genişlik ve yüksekliği almak gerekir . Bunu saklıdır kısmında çizmek kalmamak

Sen hesaba Görünüm atanan dolgu almalıdır.

OnDraw yönteminizdeki nesneleri ayırmaktan kaçınmalısınız, çünkü bu çok denir. görünümünüzü bir XML düzeni belirtilmesi izin vermek için

, bir Bağlam ve öznitelik alan kurucuya sağlamanız gerekir. AttributeSet, XML özniteliklerinin görünümünüze geçirildiği mekanizmadır.

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

Teşekkür ederim, bu benim için bir çember çiziyor. Buna yarın daha derinden bakacağım! – Tak3r07

+0

@MichaelKrause Bu çevrede ontouch veya onclick olayını nasıl etkinleştirebilirim? –

+0

@PranavMS CircleView yukarıda benim örnekte bir Görünüm olduğundan, boolean onTouchEvent (MotionEvent olay) yöntemini geçersiz kılmak ve/veya setOnClickListener arayarak üzerine bir OnClickListener ekleyebilir (View.OnClickListener l) Sen setClickable çağırmak gerekebilir (doğru) ama emin değilim. –

İlgili konular