2014-09-21 123 views
6

我从第一次尝试编写android应用程序开始。我想将pi的蒙特卡洛逼近可视化。因此,我首先想绘制一个圆到一个视图,但我没有得到它的工作! 我试图创建自己的“CircleView”类延伸“查看”,覆盖的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); 
    } 
} 

我已插入CircleView与下面的XML代码

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

(顺便说一下Android Studio中告诉我在右侧的XML视图一个的LinearLayout:“呈现问题自定义视图CircleView未使用2-或3 -argument查看构造函数; XML属性将无法工作“)

应用程序只与以下日志崩溃:http://pastebin.com/Gv1GaHtX

谁能告诉我,我做错了什么

我想这个设置将创建活动与显示的看法?圆

问候

编辑:崩溃是通过将在CircleView 2和3参数的构造固定(参见https://stackoverflow.com/a/13797457/3248708

但现在我还没有看到在活动

+0

你不看到在编辑器或设备上的任何一个圆? – 2014-09-21 16:43:33

+0

@DanielBo在设备上 – Tak3r07 2014-09-21 16:50:13

+0

为什么不用XML创建一个圆形并将其作为源添加到ImageView? – joao2fast4u 2014-09-21 17:17:29

回答

10

一些观察任何一个圆:

你需要考虑到的宽度和高度确定的圆的圆心和半径时,分配给您的看法。

你应该考虑分配给你的视图的填充,所以你不会画那个保留部分。

你应该避免在你的onDraw方法中分配对象,因为这会被调用很多。

为了让您的视图在XML布局中指定,您需要提供带有Context和AttributeSet的构造函数。 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 2014-09-21 17:55:22

+0

@MichaelKrause如何在这个圆上启用ontouch或onclick事件? – 2017-01-02 09:11:14

+0

@PranavMS既然CircleView是一个视图,我可以通过调用setOnClickListener(View.OnClickListener l)来覆盖布尔onTouchEvent(MotionEvent事件)方法和/或添加onClickListener你可能需要调用setClickable(true) ,但不确定。 – 2017-01-03 16:44:11