flutter photo_view的改造
app中对图片的浏览、缩放是一个常用的功能,目前有一款插件photo_view,基本上可以满足这些功能,但是有些地方需要修改完善
1.双击放大的时候,有三个状态,会有一个放大的中间状态,需要点击三次才能回到原始大小,这个不太符合用户的操作习惯,用户一般就是双击放大,然后在双击返回
2.缩小的时候,即使图片缩小到最小比例了,还需要双击下才能翻页,这个影响用户体验
3.放大的时候,不能翻页,很多app对图片浏览,即使是放大的时候也是可以翻页的,并且放大的状态保留,由于此插件基于pageview组件,pageview对子控件的缩放似乎支持的还不够好,所以作者采取的是放大的时候禁止pageview滚动这一方法来处理,在这里暂且不进行修改。
1.修改双击
PhotoViewScaleState nextScaleState(PhotoViewScaleState actual) {
switch (actual) {
case PhotoViewScaleState.initial:
//return PhotoViewScaleState.covering;
case PhotoViewScaleState.covering:
return PhotoViewScaleState.originalSize;
case PhotoViewScaleState.originalSize:
return PhotoViewScaleState.initial;
case PhotoViewScaleState.zooming:
return PhotoViewScaleState.initial;
default:
return PhotoViewScaleState.initial;
}
}
注释改行代码,使状态越过中间状态,其他地方不需要修改
2.修改缩放到最小,不需要双击就可以翻页
enum PhotoViewScaleState { initial, covering, originalSize, zooming,minscale }
添加一个状态
minscale
void onScaleEnd(ScaleEndDetails details) {
final double maxScale = widget.scaleBoundaries.computeMaxScale();
final double minScale = widget.scaleBoundaries.computeMinScale();
//animate back to maxScale if gesture exceeded the maxScale specified
if (_scale > maxScale) {
final double scaleComebackRatio = maxScale / _scale;
animateScale(_scale, maxScale);
final Offset clampedPosition =
clampPosition(_position * scaleComebackRatio, maxScale);
animatePosition(_position, clampedPosition);
return;
}
//animate back to minScale if gesture fell smaller than the minScale specified
if (_scale < minScale) {
final double scaleComebackRatio = minScale / _scale;
animateScale(_scale, minScale);
animatePosition(
_position, clampPosition(_position * scaleComebackRatio, minScale));
widget.setNextScaleState(PhotoViewScaleState.minscale);
return;
}
// get magnitude from gesture velocity
final double magnitude = details.velocity.pixelsPerSecond.distance;
// animate velocity only if there is no scale change and a significant magnitude
if (_scaleBefore / _scale == 1.0 && magnitude >= 400.0) {
final Offset direction = details.velocity.pixelsPerSecond / magnitude;
animatePosition(_position, clampPosition(_position + direction * 100.0));
}
}
代码中添加这一句
widget.setNextScaleState(PhotoViewScaleState.minscale); if判断增加这一句,目的是为了避免二次刷新
void didUpdateWidget(PhotoViewImageWrapper oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.scaleState != widget.scaleState &&
widget.scaleState != PhotoViewScaleState.zooming&& widget.scaleState != PhotoViewScaleState.minscale) {
final double prevScale = _scale == null
? getScaleForScaleState(widget.size, PhotoViewScaleState.initial,
widget.childSize, widget.scaleBoundaries)
: _scale;
final double nextScale = getScaleForScaleState(widget.size,
widget.scaleState, widget.childSize, widget.scaleBoundaries);
animateScale(prevScale, nextScale);
animatePosition(_position, Offset.zero);
animateRotation(_rotation, 0.0);
}
}
同样在这里也要增加判断,该状态下设置pageview的滚动特性
void scaleStateChangedCallback(PhotoViewScaleState scaleState) {
setState(() {
_locked = (scaleState != PhotoViewScaleState.initial &&
scaleState != PhotoViewScaleState.minscale);
});
widget.scaleStateChangedCallback != null
? widget.scaleStateChangedCallback(scaleState)
: null;
}
代码在这三个文件里,可以将源文件放于一个目录下
flutter photo_view的改造的更多相关文章
- Flutter混合工程改造实践
背景 6月下旬,我们首次尝试用Flutter开发AI拍app.开发的调研准备阶段没有参考业界实践,导致我们踩到一些填不上的坑.在这些坑中,最让我感到棘手的是Flutter和原生页面混合栈管理的问题. ...
- flutter中的异步机制Future
饿补一下Flutter中Http请求的异步操作. Dart是一个单线程语言,可以理解成物理线路中的串联,当其遇到有延迟的运算(比如IO操作.延时执行)时,线程中按顺序执行的运算就会阻塞,用户就会感觉到 ...
- flutter中的异步机制 Future
饿补一下Flutter中Http请求的异步操作. Dart是一个单线程语言,可以理解成物理线路中的串联,当其遇到有延迟的运算(比如IO操作.延时执行)时,线程中按顺序执行的运算就会阻塞,用户就会感觉到 ...
- Flutter 的异步机制Future
Dart是一个单线程语言,可以理解成物理线路中的串联,当其遇到有延迟的运算(比如IO操作.延时执行)时,线程中按顺序执行的运算就会阻塞,用户就会感觉到卡顿,于是通常用异步处理来解决这个问题. Dart ...
- 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app
为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...
- 对flutter中,ExpsionPanel的简单改造
因为项目有大量的下拉面板,而默认的组件(默认的padding.颜色.大小)不是我们UI设计上想要的,但是每个地方都要去改又很麻烦.于是我就想,可以对这个组件进行定制化改造,传入一些颜色.参数.图标大小 ...
- Flutter 实现原理及在马蜂窝的跨平台开发实践
一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和 ...
- Flutter 即学即用系列博客——03 在旧有项目引入 Flutter
前言 其实如果打算在实际项目中引入 Flutter,完全将旧有项目改造成纯 Flutter 项目的可能性比较小,更多的是在旧有项目引入 Flutter. 因此本篇我们就说一说如何在旧有项目引入 Flu ...
- Flutter路由的跳转、动画与传参(最简单)
跳转 命名路由 在文件构建时先设置路由参数: new MaterialApp( // 代码 routes: { "secondPage":(BuildContext context ...
随机推荐
- MySQL实战 | 04 为什么要使用索引?
原文链接:MySQL实战 | 为什么要使用索引? 用过 MySQL 的应该都知道索引是干啥的吧,应该多少都设置过索引,但是若是问你索引是怎么实现的,你能说上来吗? 索引是什么? MySQL 官方对索引 ...
- iPhone4s 9.2.1安装cydia(越狱)
依据网上资料而来 主要就是上图视频中的6步骤选项,不要选错. 1.prepare for jailbreak 2.选择Accept 3. proceed with jailbreak 4.begin ...
- python当前路径
os.getcwd()获取系统路径 sys.path [0]获取当前路径
- java 并发synchronized使用
从版本1.0开始,java中每个对象都有一个内部锁,如果一个方法用synchronized修饰,那么对象的锁将保护整个方法,也就是说要调用该方法,线程必须获得内部的对象锁 换句话说 public sy ...
- gradle 项目构建以及发布maven 私服&& docker 私服构建发布
1. 项目结构 2. 代码说明 a. Dockerfile docker 构建的 FROM openjdk:8-jre-alpine WORKDIR /appdemo/ COPY build/di ...
- web 优化原则
1. 减少http 请求 2. 使用CDN 3. 添加expires 头 4. gzip 压缩 5. 样式表放在头部 6. 脚本放底部 7. 避免css 表达式 8. 使用 ...
- JS脚本不能运行
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/moqiang02/article/details/25898295 这段时间在做前端的动态页面,出了 ...
- mount: /dev/sdb already mounted or /sheepdog1 busy(multipath,wwid,uuid,udev)
正常处理逻辑: 先umount /dev/sdb或是umount /backup如果还是显示的busy,你试试下面的方法fuser -m /dev/sdb查看一下是否sdb1正在被使用,或是有进程正在 ...
- 【转】linux内核态和用户态的区别
原文网址:http://www.mike.org.cn/articles/linux-kernel-mode-and-user-mode-distinction/ 内核态与用户态是操作系统的两种运行级 ...
- arm_linux QT+v4l 显示视频
1.参考(原创)基于ZedBoard的Webcam设计(三):视频的采集和动态显示 下载代码实测可用. 2.重新下载了csdn的代码,缺widget.h文件,后重新生成widget工程(自动产生wid ...
