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方法