Canvas.drawCircle()在硬件加速下有大圆圈

时间:2011-12-12 23:56:01

标签: android

在开发Android应用程序的过程中,我发现需要绘制 几个未填充的同心圆以任意点为中心,足够 其中一些只在显示屏上部分可见。但是,这不是 似乎适用于硬件加速。我的试验台是三星Galaxy的股票 选项卡10.1运行Android 3.2。

以下代码来自View我编写的一个测试子类来隔离 问题:

private Paint paint = new Paint();

private int count = 0;

private static final int[] COLORS = { 0xffff0000, 0xff00ff00, 0xff0000ff, 0xffff00ff };

public TestCircles(Context context) {
    super(context);
    paint.setStrokeWidth(1.0f);
    paint.setStyle(Paint.Style.STROKE);
}

public TestCircles(Context context, AttributeSet attributes) {
    super(context, attributes);
    paint.setStrokeWidth(1.0f);
    paint.setStyle(Paint.Style.STROKE);
}

public boolean onTouchEvent(MotionEvent e) {
    if (e.getAction() == MotionEvent.ACTION_DOWN)
        invalidate();
    return true;
}

protected void onDraw(Canvas canvas) {

    // Pick the color to use, cycling through the colors list repeatedly, so that we can
    // see the different redraws.
    paint.setColor(COLORS[count++]);
    count %= COLORS.length;

    // Set up the parameters for the circles; they will be centered at the center of the
    // canvas and have a maximum radius equal to the distance between a canvas corner
    // point and its center.
    final float x = canvas.getWidth() / 2f;
    final float y = canvas.getHeight() / 2f;
    final float maxRadius = (float) Math.sqrt((x * x) + (y * y));

    // Paint the rings until the rings are too large to see.
    for (float radius = 20; radius < maxRadius;
            radius += 20)
        canvas.drawCircle(x, y, radius, paint);
}

我正在运行TestCircles作为Activity中唯一的View,并将其填充 可用的宽度和高度(即几乎全屏)。我可以点击 在重绘之前,显示(触发重绘)只有几次 发生(即圆圈的颜色不会改变)。实际上,onDraw()代码是 仍在运行以响应每个点击 - 正如诊断消息所证明的那样 - 但屏幕上没有任何变化。

当onDraw()首次开始无法重绘时,调试日志包括 以下条目,每次调用onDraw()时都会执行一次:

  

E / OpenGLRenderer(21867):OpenGLRenderer内存不足!

如果我关闭清单中的硬件加速,这些问题就会消失 - 这并不奇怪,因为显然OpenGL存在问题 - 事实上确实如此 比它在硬件下实际工作的几次快得多 加速度。

我的问题是:

  1. 我是否滥用Canvas,或者这是一个bug,还是两者兼而有之? Android分配大吗? 引擎盖下的位图画出这些圆圈?这似乎不应该是这样 这对OpenGL来说很有挑战性,但我是硬件加速应用程序开发的新手。

  2. 绘制具有部分的大型未填充圆圈有什么好的替代方法 延伸到画布的剪裁区域?失去硬件加速 不是一种选择。

  3. 提前致谢...

1 个答案:

答案 0 :(得分:0)

我从其他人那里了解到我在这里描述的问题是Android 3.2中的一个错误的结果。现在的解决方法当然是使用软件层而不是硬件加速。显然这个问题在Android 4.0(冰淇淋三明治)中得到修复。