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

Android canvas.drawCircle有时工作,有时不工作,android,android-canvas,draw,Android,Android Canvas,Draw,我买了《Android编程》这本书,这本书让人有点困惑和失望,因为他们的Github()和书中有不同的代码。我被困在一个例子中,这个例子教我如何在一个随机点上画一个圆,用指定给按钮的颜色,比如,当我单击红色按钮时,它应该在视图中画一个红色的圆 我做了一些额外的代码,不知怎的我设法让它工作。以下是我的onDraw方法: @Override protected void onDraw(Canvas canvas) { paint.setStyle(Style.STROKE); paint.setCo

我买了《Android编程》这本书,这本书让人有点困惑和失望,因为他们的Github()和书中有不同的代码。我被困在一个例子中,这个例子教我如何在一个随机点上画一个圆,用指定给按钮的颜色,比如,当我单击红色按钮时,它应该在视图中画一个红色的圆

我做了一些额外的代码,不知怎的我设法让它工作。以下是我的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,效果也是一样的

此外,还发生了一些奇怪的事情:如果我用
50
替换
p.getY()
p.getX()
,它将永远不会在屏幕上绘制任何东西。50不应超出屏幕界限

在下面的图像中,您可以看到渲染的内容以及我用于创建视图的一些代码

下面是一些额外的相关代码

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

将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*/);

}
(我认为点直径应该是点半径,但现在还可以。)

那么,如何让它在屏幕上的任意位置画一个圆呢?

以下是一些想法:

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

points.addPoint(
            rnd.nextInt() % pointView.getWidth(),
            rnd.nextInt() % pointView.getHeight(),
            color, POINT_DIAMETER /*always 6*/);
在onClick方法中,尝试添加一个调用以使无效:

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);
这就是我现在所能想到的


希望这有帮助:)

我得到了相同的结果,但是%而不是*使得渲染某些内容更加困难,可能是因为某些值小于0。我发布了我的问题的更新,带有一个屏幕截图,看一看:Dremove the setScaleX(50)行!这就是为什么你的圆被拉伸成那样,我认为这与点视图的大小有关,也许它在X轴上拉伸得“远远的”。因为,正如你所看到的,在我的截图中,圆圈是椭圆形的,在X轴上拉伸。我不知道该怎么做才能修复它:(当您编写pointView.setScaleX(20)时),你基本上是在告诉整个视图在X轴上将所有东西拉伸到原来比例的20倍。删除这行代码。我到底为什么要写这行代码?说真的……也许我是在试图设置宽度,直到我想起我可以使用LayoutParameters来做。这太愚蠢了。谢谢,兄弟!
pointView.setScaleX(20);