【问题标题】:How to add a double tap gesture to video player without loosing the focus of controls?如何在不失去控件焦点的情况下向视频播放器添加双击手势?
【发布时间】:2020-12-08 15:49:38
【问题描述】:

我尝试过包装

return ClipRRect(
            borderRadius: BorderRadius.circular(30.0),
            child: Chewie(
              controller: _chewieController,
            )

return Stack(
            children: [
              ClipRRect(
                borderRadius: BorderRadius.circular(30.0),
                child: Chewie(
                  controller: _chewieController,
                ),
              ),
              Positioned.fill(child: GestureDetector(
                onDoubleTap: (){
                  print('its double tapped ');
                },
                child: Container(
                  color: Colors.transparent,
                  height: double.infinity,
                  width: double.infinity,
                ),))
            ],
          );

现在我可以双击,但是单击一次,控制器不会出现,有什么办法可以实现这两个目标。
使用 doubleTap,我可以调用类似的函数并使用 onTap 来显示控制器。
上面使用的包chewie 0.12.0

【问题讨论】:

    标签: flutter dart flutter-dependencies flutter-video-player


    【解决方案1】:

    我不知道Chewie 是如何构建的,但如果有 GestureDetector 你可以将其更改为这样的:

    GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () => setState(() => // show_controls,),
        onDoubleTap:() => setState(() => // like behaviour,),
        child: VideoWidget // or whatever is there
    }
    

    因此,您可以在一个小部件上同时拥有两个侦听器。我认为onTap 这样会稍微延迟检查它是否不是onDoubleTap。这样您就不必在小部件顶部放置叠加层。

    如果出于某种原因你想要这个覆盖......那么这里有趣的属性是behaviour,因为它决定后面的元素是否会接收事件。

    https://api.flutter.dev/flutter/rendering/PlatformViewHitTestBehavior-class.html

    更新 试试改成

    GestureDetector(
                    behavior: HitTestBehavior.translucent,
                    onDoubleTap: (){
                      print('its double tapped ');
                    }
    

    在 github 项目中,这一行: https://github.com/flutter/plugins/blob/master/packages/video_player/video_player/example/lib/main.dart#L290

    似乎控件仅在视频处于暂停状态时显示。关于这个值controller.value.isPlaying

    为什么不在你自己的 GestureDetector 中控制它?

    GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () => setState(() => _controller.pause() ,), //changing here 
        onDoubleTap:() => setState(() => // like behaviour,),
        child: VideoWidget // or whatever is there
    }
    

    不管怎样,希望你能找到答案

    【讨论】:

    • 嘿,感谢您的回复,但主要关注的是视频播放器,而不是手势检测器。我需要知道视频播放器是否有任何显示控制功能。
    • 专门用于 Chewie 或 video_player 1.0.1
    • 好的,如果官方文档中没有你想要使用的包,你应该提供一些描述,否则很难知道你在使用什么
    • 哦,我的错 :D 它是由颤振团队开发的
    • 我正在使用 Chewie,我可以看到的是,通过您的方法未检测到 onTap,但仍然在 onTap 上显示控制器及其检测双击行为,所以简而言之,我能够实现我想要的,所以谢谢你:)
    【解决方案2】:
    return GestureDetector(
                behavior: HitTestBehavior.opaque,
                onTapDown: (_) {
                  setState(() {
                    isMute = !isMute;
                    _chewieController.setVolume(isMute ? 0 : 1);
                  });
                },
                onDoubleTap: (){
                  print('liked');
                },
                child: ClipRRect(
                  borderRadius: BorderRadius.circular(30.0),
                  child: Chewie(
                    controller: _chewieController,
                  ),
                ),
              );
    

    在视频上的简单 onTap 上,它显示了控制器,因此这里的 onTap 没有被覆盖
    onTapDown 用于替代 onTap 以使视频静音。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2021-04-16
      • 2011-12-12
      • 1970-01-01
      • 2013-01-04
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多