關(guān)于flutter播放某些gif圖,比正常圖快的問題

flutter在加載gif圖時,有時候會遇到加載的gif圖跟磕了藥一樣,播放的特別快;
使用ps打開,發(fā)現(xiàn)播放快的圖,幀與幀之間沒有設(shè)置間隔;至于為什么電腦上打開沒有問題,那是因為如果幀間隔為0,電腦上默認(rèn)是0.1s;
但是flutter就不一樣了,他沒有設(shè)置默認(rèn)間隔時間,也就是以0s播放的;查看image stream源碼發(fā)現(xiàn),其實gif圖的播放是每幀之間通過延時xms進行播放,大多數(shù)手機刷新率是60,按理說應(yīng)該是每秒60幀圖像,實際上flutter通過SchedulerBinding.instance.scheduleFrameCallback去處理下一幀播放的;

修改方案:
既然Windows和macos上如果幀間隔為0,就默認(rèn)0.1s播放,那我們也可以把flutter的默認(rèn)幀間隔改為0.1s
修改代碼如下:
先找到flutter/packages/flutter/lib/src/painting/image_stream.dart文件
在給_frameDuration賦值時,判斷一下是否為0,如果是0就給個默認(rèn)的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方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容