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