Как добавить жест двойного касания в видеопроигрыватель, не теряя фокуса элементов управления?

#flutter #dart #flutter-dependencies #flutter-video-player

#flutter #dart #flutter-зависимости #flutter-видеопроигрыватель

Вопрос:

Я попробовал это, обернув

 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 я могу вызвать функцию like, а с помощью onTap показать контроллеры.

пакет, используемый выше, chewie 0.12.0

Ответ №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
}
 

В любом случае, надеюсь, что вы найдете ответ

Комментарии:

1. Привет, спасибо за ответ, но главное — это видеоплеер, а не детектор жестов. Мне нужно знать, есть ли какая-либо функция управления показом для видеопроигрывателя.

2. специально для Chewie или для video_player 1.0.1

3. хорошо, вы должны предоставить некоторое описание пакета, который вы хотите использовать, если его нет в официальных документах, иначе трудно понять, что вы используете

4. о, мой плохой: D его разработала команда flutter

5. Я использую 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 для отключения звука видео.