透明度的东西不需要缓慢,只要你保持在最低限度,远离旧手机。你还应该注意到alpha在某些实现中有时会被忽略,有时会被量化为丑陋的级别(一些摩托罗拉手机会将alpha值捕捉到最接近的2位值Bleh)。
我很想把它作为叠加在屏幕上的单个透明层来处理。将int数组保留为屏幕的大小,您将在其中绘制透明像素(int [width * height])。在每一帧上,调用Image.createRGBImage并将该图像绘制到屏幕上。
作为一个实验,您可能首先需要确保alpha处理不会因为用常量值填充此数组并将其绘制到屏幕上而使您减慢速度。例如。 0x80FF0000应该在屏幕上混合红色色调,并且如果此alpha业务可以在您选择的手机上使用,则可以轻松查看,即可以测量它对帧速率的影响。
接下来,您需要将圆圈绘制到此数组中。查找Bresenham's circle drawing algorithm并将其重写为绘制为像素的int数组。您可能需要维护一个查找表,该表对于您想要绘制的每个半径都有一个预先计算的半径/ sqrt(2)。
接下来是如何混合颜色以使它们重叠。最简单的方法就是将alpha值的颜色值绘制到像素中。你不会与已经绘制的圆形进行颜色混合,但它会很便宜,圆圈会与背景混合。
另一种方法是忽略颜色混合,但在alpha上做一个简单的合并。例如。
newColour = ((destColour & 0xFF000000) + 0x20000000) | srcColour;
/* Where source colour is of the form 0x00RRGGBB. Note: Adding 0x20 to alpha each
* time will only work for 7 overlapping circles. */
重叠圆圈的颜色将主导底层之一,但它们重叠这将至少允许玩家正确地看到所有的圈子的阿尔法将变得更不透明。
如果你想做一个准确的颜色混合,那么计算就复杂得多,特别是如果你将一个值与alpha混合到另一个alpha上,因为每个像素的颜色贡献会随着alpha的比例每种颜色。这不是不可能的,但使其高效是一种痛苦。我很想去找一个更便宜的选择。
来源
2009-08-03 09:12:44
izb
好主意,谢谢!我会马上写一些示例代码来测试设备是否可以处理这种方法。 – 2009-08-03 11:44:47