【问题标题】:how to make transparent area as untouchable for ImageView in Android?如何在 Android 中使 ImageView 的透明区域不可触摸?
【发布时间】:2012-10-03 08:57:06
【问题描述】:

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

【问题讨论】:

    标签: android imageview transparent


    【解决方案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. 更复杂的是,它可能是您在运行中构建的图像,并且从未真正以可搜索的方式知道它的最终状态。如果是这种情况,您将需要在创建图像时构建一个单独的布尔值二维数组,以确定哪些点是不透明的,哪些不是。

    【讨论】:

    • 这个方法看起来不错,但我认为它的性能会很差。也很难处理像素。不过,谢谢你的回答
    • 谢谢 - 我查看了您对 @vinod 的评论,在我的回答中看起来像是选项 2 的巧妙实现,所以我在其中添加了参考。
    【解决方案2】:

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

    【讨论】:

    • 我也在为一些动画旋转图像,所以我不能分割它。感谢您的回复。
    【解决方案3】:

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

    【讨论】:

    • 嗨@vinod,你能发布示例代码,包括以这种方式工作的触摸处理程序吗?我很想尝试一下,因为我以前没有见过这种方法。
    • 如果有什么方法可以彻底清除透明区域,那真的很有用。请与我们分享示例代码。谢谢。
    • 这是我找到的解决方案:为 ImageView 启用绘图缓存,如 iv.setDrawingCacheEnabled(true)。然后在位图上获取与触摸侦听器中的坐标匹配的颜色。有效!位图 bmp = Bitmap.createBitmap(v.getDrawingCache()); int color = bmp.getPixel((int)event.getX(), (int)event.getY()); if (color == Color.TRANSPARENT) return false;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多