在开发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存在问题 - 事实上确实如此 比它在硬件下实际工作的几次快得多 加速度。
我的问题是:
我是否滥用Canvas,或者这是一个bug,还是两者兼而有之? Android分配大吗? 引擎盖下的位图画出这些圆圈?这似乎不应该是这样 这对OpenGL来说很有挑战性,但我是硬件加速应用程序开发的新手。
绘制具有部分的大型未填充圆圈有什么好的替代方法 延伸到画布的剪裁区域?失去硬件加速 不是一种选择。
提前致谢...
答案 0 :(得分:0)
我从其他人那里了解到我在这里描述的问题是Android 3.2中的一个错误的结果。现在的解决方法当然是使用软件层而不是硬件加速。显然这个问题在Android 4.0(冰淇淋三明治)中得到修复。