这个虽然是仿微信的,但是以我自己项目里的要求为主,去掉了一些操作。

这个代码铐去就可以用的。

讲下思路:

手势滑动,不松手前以触摸点的坐标为移动,松手了,按滑动速度,以及滑动范围是否超过一半的屏幕作为是否切换图片的依据,否则回滚到原来的位置。

到顶了的处理

文字的投影,防止背景色为白色的字体会看不见

图片以宽度为准,高度可滑动查看(无需求)

缩放(无需求)

手机截图

//图片查看

import 'package:flutter/material.dart';

//import 'dart:async';

/*

* imgs 格式[{url:'',file:File}]

* img 当前点击进入的图片

* width 屏幕宽度

*/

class ViewDialog extends StatefulWidget {

ViewDialog({Key key, this.img, this.imgs, this.width}) : super(key: key);

final img;

final imgs;

final width;

@override

_PageStatus createState() => _PageStatus();

}

class _PageStatus extends State {

var image;

var w;

var index = 1;

var _scrollController;

var down = 0.0; //触开始的时候的left

var half = false; //是否超过一半

last() {

if(1 == index) {

}else {

setState(() {

image = widget.imgs[index - 2];

index = index - 1;

});

}

}

next() {

if(widget.imgs.length == index) {

}else {

setState(() {

image = widget.imgs[index];

index = index + 1;

});

}

}

delete() {

Navigator.pop(context);

}

@override

void initState() {

//页面初始化

super.initState();

var n = 0;

var nn;

widget.imgs.forEach((i) {

n = n + 1;

if(i['key'] == widget.img['key']) {

nn = n;

}

});

print(nn);

if(nn > 1) {

print(widget.width);

_scrollController = ScrollController(

initialScrollOffset: widget.width * (nn - 1)

);

}else {

_scrollController = ScrollController(

initialScrollOffset: 0,

);

}

setState(() {

image = widget.img;

index = nn;

});

}

nextPage(w) {

setState(() {

index = index + 1;

_scrollController.animateTo(

(index -1) * w,

duration: Duration(milliseconds: 200),

curve: Curves.easeIn,

);

});

}

lastPage(w) {

setState(() {

index = index - 1;

_scrollController.animateTo(

(index - 1) * w,

duration: Duration(milliseconds: 200),

curve: Curves.easeIn,

);

});

}

moveEnd(e,w,l) {

var end = e.primaryVelocity;

if(end > 10 && index > 1) {

lastPage(w);

}else if(end < -10 && index < l){

nextPage(w);

}else if(half == true){

if(down > w/2 && index < l) {

//右边开始滑动超过一半,则下一张

nextPage(w);

}else if(down < w/2 && index > 1){

lastPage(w);

}else {

_scrollController.animateTo(

(index -1) * w,

duration: Duration(milliseconds: 200),

curve: Curves.easeIn,

);

}

}else {

_scrollController.animateTo(

(index -1) * w,

duration: Duration(milliseconds: 200),

curve: Curves.easeIn,

);

}

}

imgMove(e,w,l) {

//down 为起点

var left = e.position.dx;

var now = (index -1 ) * w;

var move = left - down;//移动距离

if(left - down > w/2 || down - left > w/2) {

half = true;

}else {

half = false;

}

_scrollController.jumpTo(now - move);

}

Widget list(w,l) {

List array = [];

widget.imgs.forEach((i) {

array.add(

Listener(

onPointerMove: (e) {

imgMove(e,w,l);

},

onPointerDown: (e) {

down = e.position.dx;

},

child: GestureDetector(

onTap: (){

Navigator.pop(context);

},

onHorizontalDragEnd: (e) {moveEnd(e,w,l);},

child: Container(

width: w,

child: i['url'] != null ? Image.network(i['url']) : Image.file(i['file']),

),

),

),

);

});

return ListView(

controller: _scrollController,

scrollDirection: Axis.horizontal,

children: array,

);

}

@override

Widget build(BuildContext context) {

w = MediaQuery.of(context).size.width;

var l = widget.imgs.length;

return Container(

color: Colors.black,

child: Stack(

children: [

list(w,l),

Positioned(

top: 20,

child: Container(

alignment: Alignment.center,

width: w,

child: Text('$index/$l',style: TextStyle(

decoration: TextDecoration.none,

color: Colors.white,fontSize: 16,

fontWeight: FontWeight.w400,

shadows: [

Shadow(color: Colors.black, offset: Offset(1, 1)),

],

))

),

),

Positioned(

top: 20,

right: 20,

child: Container(

alignment: Alignment.centerLeft,

width: 20,

child: GestureDetector(

onTap: () {delete();},

child: Icon(Icons.delete,color: Colors.white),

),

),

),

],

),

);

}

}

flutter图片预览_flutter 图片查看,仿微信相关推荐

  1. flutter图片预览_flutter - 图片预览放大滑动(photo_view)

    使用flutter 插件photo_view 官方使用方法 pubspec.yaml dependencies: photo_view: ^0.4.2 $ flutter pub get 2.demo ...

  2. php仿微信多图片预览上传,PHP仿微信多图片预览上传功能

    [html] view plain copy 在CODE上查看代码片派生到我的代码片 plupload上传 [javascript] view plain copy 在CODE上查看代码片派生到我的代 ...

  3. 【若依(ruoyi)】表格图片预览功能图片超宽、超高问题

    前言 若依(ruoyi): v4.3 360极速浏览器 12.0.1550.0 (正式版本) (32 位) 操作系统 Windows 10 OS Version 2004 (Build 19041.5 ...

  4. 图片预览与图片通过预留接口上传

    提示:图片预览与图片通过预留接口上传的笔记 图片前端预览: 前提:通过input[type=file]让用户选择文件,通过事件对象.target.files拿到用户选择的"文件对象" ...

  5. flutter图片预览_flutter好用的轮子推荐四-可定制的图片预览查看器photo

    前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!F ...

  6. flutter图片预览_flutter好用的轮子推荐四-可定制的图片预览查看器photo_view

    前言 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. IT界著名的尼古拉斯·高尔包曾说:轮子是IT进步的阶梯!热门的框架千篇一律,好用轮子万里挑一!F ...

  7. android 图片预览动画,Android实现仿Windows7图片预览窗格效果

    本实例将显示类似于windows7提供的图片预览窗格效果,单击任意一张图片,可以在右侧显示该图片的预览效果. 效果如图所示: 具体实现方法: res/layout/main.xml: android: ...

  8. 图片预览,图片显示以及图片删除

    1***.添加图片* $(document).ready(function () {$("#picture").change(function () {document.getEl ...

  9. 打印图片预览时图片显示不出来_办公小技巧:深入挖掘实用的Excel打印秘诀

    我们在打印Excel表格的时候,经常会遇到一些意想不到的问题,比如表格一页多一点,想打印在一页纸上,这就需要调整.还有就是一个大型数据表,只需打印其中的一部分,此时就需要将这些数据进行分离等等--其实 ...

最新文章

  1. Linux下tomcat的安装与卸载以及配置(超简单)
  2. Kotlin特色之object、let、with、run、apply、also函数的使用
  3. linux inotify-tools 监控文件变化
  4. python切片语法-详解Python 切片语法
  5. python3下载教程-Python3完全零基础入门精讲 全套视频教程
  6. C++对象内存布局--⑤GCC编译器--单个虚拟继承
  7. 2017-06-08 前端日报
  8. bat脚本监控tomcat并启动_Windows server利用批处理脚本判断端口启动tomcat的方法
  9. 搬寝室(HDU 1421 DP)
  10. Craigslist模式在中国如何复制?中国特色的差异化在哪里?,互联网营销
  11. linux下tomcat部署java web项目_在linux下用tomcat部署java web项目的过程与注意事项
  12. web3应用与dApp理解
  13. ESP32上手笔记 | 05 - 获取MPU6050数据进行姿态解算和展示(I2Cdev+MPU6050+Processing)
  14. Text to image论文精读 NAAF:基于负感知注意力的图像-文本匹配框架 Negative-Aware Attention Framework for Image-Text Matching
  15. cordova获取手机IMEI
  16. Quartus II下载器件库
  17. 论文阅读之《Quasi-Unsupervised Color Constancy 》
  18. 微信小程序自定义card图文组件
  19. 开运算和闭运算的作用
  20. Pandas处理日期数据的常见操作集锦

热门文章

  1. 用户可以通过音乐播放器来选择以及学习自己喜欢的歌曲
  2. 2022年大学英语B统考题库网考最新试题
  3. GBK 与GB2312
  4. 解决Java程序在MOTO E680i中声音文件播放
  5. 360浏览器如何禁止切换到兼容模式[终极办法]
  6. wince和window mobile winphone
  7. 2021年危险化学品经营单位安全管理人员考试及危险化学品经营单位安全管理人员模拟考试
  8. 分享价值五百万的人工智能核心代码
  9. [课业] 13 | 软工 | 需求基础
  10. crossover linux 中文乱码,在Ubuntu Kylin下用Crossover安装东方财富出现内容乱码的处理...