我买了“编程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不应超出屏幕范围。
在下面的图片中,您可以看到它的呈现内容以及我用来创建视图的一些代码。
这是一些额外的相关代码。
设置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,但现在还可以。)
那么,我怎样才能让它在屏幕上的随机位置画圆圈?
答案 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);
这就是我现在所能想到的。
希望这会有所帮助:)