1

我买了 Programming 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()and 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 但现在还可以。)

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

4

1 回答 1

2

这里有一些想法:

在 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);

这就是我现在能想到的。

希望这可以帮助 :)

于 2013-10-14T02:50:29.427 回答