如何在 Android 上使用 PNG 图像将多边形(由点集合指定)设置为透明?
问问题
875 次
1 回答
2
为了实现这一点,您必须首先从 a 获取对资源的引用BitmapFactory
:
Bitmap my_image = BitmapFactory.decodeResource(getResources(), R.drawable.[your_image]);
然后,您必须使用该setPixels()
方法在 PNG 上定义要透明的区域。我相信,透明度是通过将像素设置Color
为 0 来实现的。
派生多边形将是您必须在应用程序中进行的一些计算,然后将多边形的尺寸传递给setPixels()
方法。有关如何使用该方法的想法,请参阅从 Android 开发人员文档中获取的此链接。setPixels()
请注意,这假定您的 PNG 文件是mutable。你会得到一个IllegalStateException
否则。
推导 N 边多边形的面积
这是您的问题变得更具挑战性的地方。由于您不能使用传统的面积公式(因为面积与此示例无关,而是与顶点所在的位置有关),您必须自己想办法计算必须透明的区域。
我能想到的一种方法是测试用户绘制线的一部分下方的所有像素并将它们标记为透明,直到遇到交叉点,然后重复此操作直到到达图像的底部。请参阅此图以供参考:
此处的 ΔX 是任意定义的像素长度,可以增加以提高精度,也可以降低以提高性能。获得这种透明度的过程如下:
- 获取最左侧的值,该值是用户绘制的顶点的一部分;
- 向下移动图像(通过减小方法
Y
中的值getPixel()
直到与另一个用户绘制的顶点发生碰撞,在使用时将像素更改为透明setPixel()
并传入当前坐标; - 当与另一个顶点碰撞时,停止改变像素的透明度,而是继续向下解析列;
- 同样,如果您到达另一个顶点,请开始将以下像素标记为透明;
- 重复此操作,直到到达图像底部;
- 将 X 值增加您预定义的常数 ΔX,并在下一列重复此操作。
请注意,在设置透明度和不设置透明度之间切换很重要(您可以使用 aboolean
来保持状态),因为多边形可能“弯曲”并返回到您正在解析的列中。
于 2012-11-05T18:20:05.003 回答