2014-09-21 6 views
6

Я начинаю с моих первых попыток написать приложение для Android. Я хотел бы представить себе приближение Монте-Карло для pi. Поэтому я сначала хочу нарисовать круг на вид, но я не получаю его работу! Я попытался создать свой собственный класс "CircleView", который проходит "View" и перезаписать метод OnDraw (..), как его объяснено здесь: How to draw circle by canvas in Android?Нарисуйте круг на вид (android)

Это мой 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 вставил CircleView в LinearLayout со следующим 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-студия говорит мне в XML-виде на правой стороне: «Rendering проблема пользовательского вида CircleView не используя 2- или 3 - просмотр конструкторов; атрибуты XML не будут работать ")

Приложение просто рушится с логом: http://pastebin.com/Gv1GaHtX

Может кто-то сказать, что я сделал неправильно

Я думал, что эта установка будет создавать деятельность с целью, которая отображает? окружность

Привет

Редактировать:. сбой фиксируется путем добавления конструктора 2 и 3 параметра в CircleView (См https://stackoverflow.com/a/13797457/3248708)

Но теперь я до сих пор не вижу круг в деятельности

+0

вы не видите какой-либо круг в редакторе или на устройстве? –

+0

@ DanielBo на устройстве – Tak3r07

+0

Почему вы не создаете форму круга в XML и не добавляете ее в качестве источника в ImageView? – joao2fast4u

ответ

10

Несколько наблюдений:

Вы должны принять во внимание ширину и высоту, присвоенный вашему мнению, при определении точки центра вашего круга в радиус и ,

Вы должны учитывать отступы, назначенные вашему виду, чтобы вы не рисовали эту зарезервированную часть.

Вам следует избегать выделения объектов в вашем методе onDraw, так как это называется много.

Для того, чтобы ваше представление указывалось в макете XML, вам необходимо предоставить конструктор, который принимает контекст и атрибутный набор. AttributeSet - это механизм, с помощью которого ваши XML-атрибуты передаются вашему представлению.

Дайте этому попытку:

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

Спасибо, это рисует круг для меня. У меня будет более глубокий взгляд на это завтра! – Tak3r07

+0

@MichaelKrause, как я могу включить ontouch или onclick событие на этом круге? –

+0

@PranavMS Поскольку CircleView является представлением в моем примере выше, вы можете переопределить метод boolean onTouchEvent (MotionEvent) и/или добавить onClickListener на него, вызвав setOnClickListener (View.OnClickListener l) Возможно, вам придется вызвать setClickable (true) , но не уверен. –

Смежные вопросы