1

我用谷歌搜索了很多,但找不到任何有用的东西。我有一个复杂的 png 图像,我想让它可以触摸,但仅限于它的不透明区域。我为它设置了一个触摸监听器,但即使我点击了一个透明区域,它也会发送,这就是我不想要的。

4

3 回答 3

1

正如@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,您需要通过以下三种方式之一来实现它:

  1. 在这种情况下,图像可能很容易分割成不透明和不透明的区域:

    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;
    }
    
  2. 以这种方式处理图像可能并不容易,在这种情况下,您将需要使用 x 和 y 触摸位置来检查源图像(缩放到它在屏幕上的大小)是否该点是不透明的。编辑:您在下面对@vinod 的评论中似乎以一种相当简洁的方式使用了此解决方案,因此我建议其他读者也检查该评论。

  3. 更复杂的是,它可能是您在运行中构建的图像,并且从未真正以可搜索的方式知道它的最终状态。如果是这种情况,您将需要在创建图像时建立一个单独的 2D 布尔数组,以确定哪些点是不透明的,哪些不是。

于 2012-10-03T09:32:51.950 回答
0

触摸侦听器适用于整个视图,而不是视图的一部分。所以我建议您将图像分成小块,并在每块不透明的部分上添加触摸侦听器。希望可以帮助您获得更多帮助您也可以尝试在此处发布图片,以便我们可以更好地看到您想要实现的目标..

于 2012-10-03T09:03:22.960 回答
0

@user1716538:你为什么不使用 png 图片?您可以使用 png 图像删除图像中不需要的部分,因此图像的这些部分不会发生单击事件。

于 2012-10-03T09:24:22.803 回答