canvas.drawCircle无法工作,而drawLine可以正常工作-可能是由于使用Sherlock引起的?

3

我在使用标准方法canvas.drawCircle时遇到了一个奇怪的问题。

当我在安卓4.0.4系统的三星Galaxy S3和2.1系统的另一台S2上运行完全相同的代码时,它可以正常工作。但是,在4.0.3系统的Acer 500平板电脑上调用drawCircledrawPath时却没有任何绘制。

以下是代码:

    Paint thickLine = new Paint(scalePaint);
    thickLine.setStrokeWidth(0.07f);
    thickLine.setColor(Color.argb(0xff, 0xff, 0x36, 0x33));
    thickLine.setFlags(Paint.ANTI_ALIAS_FLAG);
    canvas.drawLine(0.5f, 0.5f, 0.1f, 0.1f, thickLine);
    canvas.drawCircle(0.5f, 0.5f, 0.15f, thickLine);

但是 drawLine 在这三个设备上都可以运行!

另外需要提到的是 - 代码之前是可以工作的 - 然后我将标准 Fragments 更改为 SherlockFragments 并在应用程序中的多个位置修改了代码 - 始终在 S3 上进行测试。所以我不知道它什么时候开始在 Acer 上不再工作。

我还使用了旧的未更改过的绘图类,其中包含此代码(在对应用程序进行所有更改之前),并将其复制到现在使用 Sherlock 的新版本中 - 即使在该项目代码的这个阶段也不能正常工作。

因此,我猜它可能与Sherlock有关 - 但是,我不知道如何以及为什么 - 如果的确存在....

是否有人有类似的经验,其中 drawLine 可以工作,但 drawCircledrawPath 不行? - 使用或不使用 Sherlock

非常感谢


1
我可以告诉你,这与ActionBarSherlock无关。 - Jake Wharton
非常感谢,现在我可以专注于我所做的所有其他修改...顺便说一句,超级棒 - 我最近才开始使用Sherlock - 但它真的很棒。非常感谢! - user387184
4个回答

1
我曾经遇到过同样的问题 - Canvas.drawCircle 对我不起作用。 幸运的是,还有另一个函数 - Canvas.drawOval。您可以使用它来绘制圆形而无需更改构建目标。
RectF tmpRect = new RectF();
tmpRect.top = 0;
tmpRect.bottom = diameter;
tmpRect.left = 0;
tmpRect.right = diameter;

//This call will draw nothing
canvas.drawCircle(tmpRect.centerX(), tmpRect.centerY(), tmpRect.width() / 2, selectionPaint);
//This call will draw a circle
canvas.drawOval(tmpRect, selectionPaint);

0

几乎难以置信但却是真的,只需更改目标设置(或完全删除它),它就会起作用 - 在我的情况下确实如此 :-)


我可以问一下,您最初的目标设置是什么,以及您更改了哪些设置才使其正常工作?在Android 4.0.4中,我遇到了drawPath()的问题,因为它不绘制(但在早期版本中是这样的)。 - D-Dᴙum
现在我只有这个:<uses-sdk android:minSdkVersion="7" /> 之前我也设置了目标,但没有起作用。 - user387184
谢谢您的回复。我已经尝试过调整SDK版本,但没有成功。然而,在我的情况下,我发现Canvas.scale()在Android 4.0之前和之后的表现不同。 - D-Dᴙum
César,我不记得我发布这些内容时具体在做什么,但我在绘制文本时遇到了Canvas.scale()的问题。问题和答案在这里:http://stackoverflow.com/questions/17799010/drawing-text-on-a-scaled-canvas。 - D-Dᴙum

0

我在将最低 Android 版本从2.3更改为3后遇到了同样的问题。线段可以工作,但是 drawRect 不能工作,如果我将 Android 版本改回去,所有内容都可以正常工作。 经过大量尝试和错误,我发现交换顶部和底部坐标就解决了问题。

我将左上右下的顺序更改为左下右上,它有效了。


0

我刚刚遇到了Canvas.drawLine()和Canvas.drawRect()的问题。我的线条可以画出来,但是我的矩形却不能。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);

    int height = canvas.getHeight();
    int width = canvas.getWidth();

    canvas.drawLine(width/2,0,width/2,height,paint);
    canvas.drawLine(0,height/2,width,height/2,paint);

    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(Color.GREEN);
    canvas.drawRect(touchRect, paint);
}

然而,当我在onTouchEvent()方法中调用View.invalidate()时,它开始工作了,因为我想在屏幕上触摸的位置绘制一个矩形。

@Override
public boolean onTouchEvent(MotionEvent event) {

    invalidate();

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        float x = event.getX();
        float y = event.getY();

        touchRect.left = (int) (x - 20);
        touchRect.top =(int) (y - 20);
        touchRect.right = (int) (x + 20);
        touchRect.bottom = (int) (y + 20);
    }
    return false;
}

我从阅读https://developer.android.com/guide/topics/graphics/2d-graphics.html中得到了这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接