【发布时间】:2012-10-03 08:57:06
【问题描述】:
我搜索了很多,但找不到任何有用的东西。我有一个复杂的 png 图像,我想让它可以触摸,但只是因为它的不透明区域。我为它设置了一个触摸监听器,但即使我点击了一个透明区域,它也会发送,这就是我不想要的。
【问题讨论】:
标签: android imageview transparent
我搜索了很多,但找不到任何有用的东西。我有一个复杂的 png 图像,我想让它可以触摸,但只是因为它的不透明区域。我为它设置了一个触摸监听器,但即使我点击了一个透明区域,它也会发送,这就是我不想要的。
【问题讨论】:
标签: android imageview transparent
正如@Cata 所说,触摸事件将与整个图像相关联。但是,触摸事件会告诉您触摸在图像中的哪个位置,因此可以编写类似这样的代码(忽略检查正确操作等):
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean eventHandled = false;
int x = (int) (event.getX());
int y = (int) (event.getY());
if (imageIsOpaque(x,y) {
//Do the stuff
eventHandled = true;
}
return eventHandled;
}
这里的关键是 imageIsOpaque,您需要通过以下三种方式之一来实现它:
在这种情况下,图像可能很容易分割成不透明和不透明的区域:
boolean imageIsOpaque(int touchX, int touchY) {
ArayList<Rect> rectsOfOpaqueness; // You will need to define these ...
boolean isOpaque = false;
for (int i=0; i<rectsOfOpaqueness.size() && !isOpaque; i++) {
if (rectsOfOpaqueness.get(i).contains(touchX, touchY)) {
isOpaque = true;
}
return isOpaque;
}
这样处理图像可能不太容易,在这种情况下,您需要使用 x 和 y 触摸位置来检查源图像(缩放到屏幕上的大小)是否点是否不透明。编辑:您在下面对@vinod 的评论中似乎以一种相当简洁的方式使用了此解决方案,因此我建议其他读者也检查该评论。
更复杂的是,它可能是您在运行中构建的图像,并且从未真正以可搜索的方式知道它的最终状态。如果是这种情况,您将需要在创建图像时构建一个单独的布尔值二维数组,以确定哪些点是不透明的,哪些不是。
【讨论】:
触摸监听器适用于整个视图,而不是视图的一部分。所以我建议您将图像分成小块,并在每个不透明的部分上添加触摸监听器。 我希望这可以帮助你,为了获得更多帮助,你也可以尝试在这里发布图片,以便我们更好地看到你想要实现的目标..
【讨论】:
@user1716538: 你为什么不使用 png 图片?您可以使用 png 图像删除图像中不需要的部分,因此图像的这些部分不会发生单击事件。
【讨论】: