美文网首页
关于flutter播放某些gif图,比正常图快的问题

关于flutter播放某些gif图,比正常图快的问题

作者: 陈晓青_57a8 | 来源:发表于2023-05-17 10:57 被阅读0次

    flutter在加载gif图时,有时候会遇到加载的gif图跟磕了药一样,播放的特别快;
    使用ps打开,发现播放快的图,帧与帧之间没有设置间隔;至于为什么电脑上打开没有问题,那是因为如果帧间隔为0,电脑上默认是0.1s;
    但是flutter就不一样了,他没有设置默认间隔时间,也就是以0s播放的;查看image stream源码发现,其实gif图的播放是每帧之间通过延时xms进行播放,大多数手机刷新率是60,按理说应该是每秒60帧图像,实际上flutter通过SchedulerBinding.instance.scheduleFrameCallback去处理下一帧播放的;

    修改方案:
    既然Windows和macos上如果帧间隔为0,就默认0.1s播放,那我们也可以把flutter的默认帧间隔改为0.1s
    修改代码如下:
    先找到flutter/packages/flutter/lib/src/painting/image_stream.dart文件
    在给_frameDuration赋值时,判断一下是否为0,如果是0就给个默认的100ms

    void _handleAppFrame(Duration timestamp) {
        _frameCallbackScheduled = false;
        if (!hasListeners) {
          return;
        }
        assert(_nextFrame != null);
        if (_isFirstFrame() || _hasFrameDurationPassed(timestamp)) {
          _emitFrame(ImageInfo(
            image: _nextFrame!.image.clone(),
            scale: _scale,
            debugLabel: debugLabel,
          ));
          _shownTimestamp = timestamp;
          _frameDuration = _nextFrame!.duration;
          ///修改这里
          if(_frameDuration?.inMilliseconds == 0){
            _frameDuration = Duration(milliseconds: 100);
          }
          _nextFrame!.image.dispose();
          _nextFrame = null;
          final int completedCycles = _framesEmitted ~/ _codec!.frameCount;
          if (_codec!.repetitionCount == -1 || completedCycles <= _codec!.repetitionCount) {
            _decodeNextFrameAndSchedule();
          }
          return;
        }
        final Duration delay = _frameDuration! - (timestamp - _shownTimestamp);
        _timer = Timer(delay * timeDilation, () {
          _scheduleAppFrame();
        });
      }
    

    同样如果用到了cached_network_image插件
    找到multi_image_stream_completer.dart文件,同样是修改_handleAppFrame方法

    相关文章

      网友评论

          本文标题:关于flutter播放某些gif图,比正常图快的问题

          本文链接:https://www.haomeiwen.com/subject/ioqorktx.html