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;
}

代码在这三个文件里,可以将源文件放于一个目录下

最新文章

  1. 分享20款移动开发中很有用的 jQuery 插件
  2. LeetCode:N-Queens I II(n皇后问题)
  3. css样式之 direction
  4. linux 下第一个cordova android app
  5. Flash Media Server 4.5 序列号 (fms4.5 激活码)
  6. HDU 2089 数位dp入门
  7. HTML+CSS实例——漂亮的查询部件(一)
  8. 在Apache上部署Django
  9. 使用Ant自动化发布web工程
  10. 武汉科技大学ACM:1010: 电话号码
  11. Android比较字符串是否为空(isEmpty)
  12. sql中插入多条记录-微软批处理
  13. Java项目生成静态页面
  14. GoLang获取struct的tag
  15. haproxy-代码阅读-内存管理
  16. 版本管理工具Git(2)git的安装及使用
  17. scrapy_xpath
  18. 《javascript设计模式与开发实践》阅读笔记(15)—— 装饰者模式
  19. Pairwise 找到你的另一半
  20. EXCEL日期格式要双击一下单元格才变正确格式

热门文章

  1. CSS同时使用背景图片和背景颜色
  2. BZOJ4566 Haoi2016 找相同字符【广义后缀自动机】
  3. Flask第六篇——项目配置文件
  4. Emgucv3.0的安装与配置
  5. 关于在2.7中出现 &quot;UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal&quot;
  6. .NET平台上的Model-View-Presenter模式实践
  7. 解决Vsphere Client 60天过期问题
  8. Oracle 块修改跟踪 (Block Change Tracking) 说明
  9. git 获取远程分支
  10. servlet运作机制