【问题标题】:Image Map -like functionality in Flutter?Flutter 中类似于 Image Map 的功能?
【发布时间】:2019-05-31 03:12:37
【问题描述】:

我已经搜索了很多,但没有找到可靠的答案,所以如果这是一个骗局,我真的试过了。

我正在重写一个应用程序,并从基于 html 的混合平台(特别是 Trigger.io)移出;在 Flutter 和 Dart 中快速进行重写。

应用程序的一部分包括一个非常简单的屏幕,用户可以在其中单击人体图像,并通过图像映射获取身体部位(右前臂、左膝、头部、 ETC)。

我根本无法在 Flutter 中找到与这种行为和功能类似的东西。我是否错过了一些简单的事情,因为我完全想多了?

非常感谢。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以将Image 包装在GestureDetector 中,并指定onTapDown(或onTapUp)回调来检查点击的坐标并采取相应的行动。

    (要将全局坐标转换为局部坐标,请参见:flutter : Get Local position of Gesture Detector

    这是一个粗略的尝试:

    import 'package:quiver/iterables.dart' show enumerate;
    
    class ImageMap extends StatelessWidget {
      const ImageMap({
        Key key,
        @required this.image,
        @required this.onTap,
        @required this.regions,
      }) : super(key: key);
    
      final Widget image;
      final List<Path> regions;
    
      /// Callback that will be invoked with the index of the tapped region.
      final void Function(int) onTap;
    
      void _onTap(BuildContext context, Offset globalPosition) {
        RenderObject renderBox = context.findRenderObject();
        if (renderBox is RenderBox) {
          final localPosition = renderBox.globalToLocal(globalPosition);
          for (final indexedRegion in enumerate(regions)) {
            if (indexedRegion.value.contains(localPosition)) {
              onTap(indexedRegion.index);
              return;
            }
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTapDown: (details) => _onTap(context, details.globalPosition),
          child: image,
        );
      }
    }
    

    【讨论】:

    • 是的,我一直在调查。仍然需要某种方式将这些坐标映射到图片的某些部分,而这正是图像映射在 HTML 中可以很好地处理的缺失键。我考虑过用相同形状的另一个图像覆盖图像,然后为每个不同的部分着色一个独特的颜色,然后将其不透明度降低到 0,并读取该图像上的水龙头,检查颜色值,查找部分.这就是我接下来要测试的内容。我是不是太难了?我对此很紧张,我可能处于分析瘫痪状态。
    • 如果您可以将感兴趣的区域分解为矩形,您可以使用Rect.contains。如果您有更复杂的形状,您可以使用其各种Path.add... 方法构建一个Path 并使用Path.contains
    • @ChrisH 我用更具体的例子更新了我的答案。
    • @jamesdlin 什么是枚举?
    • @BloodLoss 哎呀。我想我的意思是来自package:quiverenumerate 函数。回想起来,enumerate(regions) 可能是regions.asMap().entriesindexedRegion.key 而不是indexedRegion.index
    猜你喜欢
    • 2012-12-15
    • 2012-12-19
    • 2012-10-04
    • 2019-03-31
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多