canvas.drawCircle有时工作,有时不工作

时间:2013-10-14 02:28:12

标签: android android-canvas draw

我买了“编程Android”这本书,对于他们在Github(https://github.com/bmeike/ProgrammingAndroid2Examples/tree/master/AndroidUIDemo)和他们的书中有不同的代码有点令人困惑和失望。我被困在一个示例中,教导如何在随机点绘制一个圆圈,并使用分配给按钮的颜色,例如,当我单击红色按钮时,它应该在视图中绘制一个红色圆圈。

我做了一些额外的代码,不知怎的,我设法让它工作。这是我的onDraw方法:

@Override
protected void onDraw(Canvas canvas)
{
paint.setStyle(Style.STROKE);
paint.setColor(hasFocus() ? Color.BLUE : Color.GRAY);
canvas.drawRect(0, 0, getWidth() - 1, getHeight() - 1, paint);

    if (this.points == null) return;

    paint.setStyle(Style.FILL);

    for (Point p : points.getAllPoints())
    {
        paint.setColor(p.getColor());
        canvas.drawCircle(p.getX(), p.getY(), 
                  p.getDiameter(), paint);
    }
}

有时它可以工作,有时不工作,但是当工作时,它会画出一个薄而大的椭圆形状。

p.getDiameter()始终 6 。即使我把它放到固定的6,效果是一样的。

此外,还有一些奇怪的事情发生:如果我将p.getY()p.getX()替换为50,它将永远不会在屏幕上绘制任何内容。 50不应超出屏幕范围。

在下面的图片中,您可以看到它的呈现内容以及我用来创建视图的一些代码。

my results

这是一些额外的相关代码。

设置pointView大小(我绘制点的位置):

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);

    pointView.setLayoutParams(new android.widget.LinearLayout.LayoutParams(root.getWidth(), root.getHeight()/2));
}

在按钮上添加一个OnCLickListener,所以当我点击它时,它应画一个圆圈。

button1.setOnClickListener(new OnClickListener() //I'll not put the Red button here, for the sake of brevity.
    {
        @Override
        public void onClick(View arg0)
        {
            makeDot(pointModel, pointView, Color.GREEN);
        }
    });

makeDot方法:

private final Random rnd = new Random();
void makeDot(Points points, PointView pointView, int color)
{
    points.addPoint(
            rnd.nextFloat()*pointView.getWidth(),
            rnd.nextFloat()*pointView.getHeight(),
            color, POINT_DIAMETER /*always 6*/);

}

(我认为POINT_DIAMETER应该是POINT_RADIUS,但现在还可以。)

那么,我怎样才能让它在屏幕上的随机位置画圆圈?

1 个答案:

答案 0 :(得分:2)

以下是一些想法:

在addPoint中,尝试生成如下坐标:

points.addPoint(
            rnd.nextInt() % pointView.getWidth(),
            rnd.nextInt() % pointView.getHeight(),
            color, POINT_DIAMETER /*always 6*/);

在onClick方法中,尝试添加对invalidate:

的调用
button1.setOnClickListener(new OnClickListener() //I'll not put the Red button here, for the sake of brevity.
    {
        @Override
        public void onClick(View arg0)
        {
            makeDot(pointModel, pointView, Color.GREEN);
            pointView.invalidate();
        }
    });

设置Style.FILL时,也要设置颜色:

paint.setStyle(Style.FILL);
paint.setColor(hasFocus() ? Color.BLUE : Color.GRAY);

另外,删除以下代码行:

pointView.setScaleX(20);

这就是我现在所能想到的。

希望这会有所帮助:)