基于Flutter的图片浏览器的实现

一  效果展示:

 1. 图片展示:

      

 

2.混色,平铺,拉伸,原图展示

        

      

二  实验准备:

    1.在包结构中创建images包来存放我们用到的图片,在pubspec.yaml中声明路径:

    2. 检查虚拟机是否正常运行:

三  详细设计:

大体流程:

特别注意:

我们创建继承自State_MyHomePageState类的用处是

  1. 状态管理: State 对象是与 StatefulWidget 相关联的状态的持有者。通过继承自State,可以在这个对象中存储和管理与用户界面相关的数据。

  2. 生命周期方法: State 类提供了一系列生命周期方法,例如 initStatedidUpdateWidgetbuilddispose 等。这些方法允许在不同阶段执行特定的操作,例如在初始化状态、更新部件时、构建部件树、销毁状态等。

  3. 动态更新: 通过调用 setState 方法,可以通知Flutter框架重新构建UI。这使得在用户与应用交互时,能够根据状态的变化动态更新UI,提供交互性和实时性。

  4. 保存和恢复状态: State 对象可以保存和恢复其状态。这对于在应用生命周期内保留数据状态,以及在设备方向切换或应用关闭后恢复状态非常有用。

  5. 构建UI: build 方法是构建用户界面的地方。通过覆盖 build 方法,可以定义在状态更改时如何构建和渲染UI。

  6. 数据封装: 将相关的状态和逻辑封装在State类中有助于提高代码的组织性和可读性。这样,每个部件的状态都可以独立管理,降低了代码的复杂度。

  7. 优化性能: State 对象的状态是惰性创建的,当部件首次插入到树中时,State 对象才会被创建。这有助于优化应用性能。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

功能实现:

功能一:图片展示:

组件:

Container: 用于创建包含图片的容器。

Scaffold: 提供应用程序的基本结构,包括主体区域。

Column: 用于在垂直方向上排列不同的小部件。

属性和方法:

Container的width和height属性: 设置容器的宽度和高度。

Container的color属性: 设置容器的背景颜色。

Container的child属性: 设置容器中包含的子部件。

DecorationImage的image属性: 设置Image.asset的图片来源。

DecorationImage的repeat属性: 设置图片在容器中的重复方式。

Container imgContainer = Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height / 3,
  color: Colors.amberAccent,
  child: Container(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage(lists[index]),
        repeat: ImageRepeat.repeat,
      ),
    ),
  ),
);

功能二:效果选择 :

组件:

RadioListTile: 用于显示单选列表项。

属性和方法:

value属性: 表示当前选项的值。

groupValue属性: 表示所在组的当前选中值。

title属性: 列表项的主要文本。

subtitle属性: 列表项的副标题文本。

onChanged回调: 在用户选择该项时触发的函数。

RadioListTile(
  value: 0,
  groupValue: selected,
  title: Text('混色'),
  subtitle: Slider(
    value: colorsValue,
    min: 0,
    max: 255,
    onChanged: (value) {
      setState(() {
        colorsValue = value;
      });
    },
  ),
  onChanged: (value) {
    setState(() {
      selected = value ?? 0;
    });
  },
);

功能三:混色效果 :

组件:

Container: 用于包裹混色效果的图片。

ColorFiltered: 用于应用颜色混合效果。

属性和方法:

colorFilter属性: 设置ColorFiltered的颜色混合滤镜。

Color.fromARGB方法: 创建一个颜色对象。

round()方法: 将浮点数四舍五入为最接近的整数。

ColorFiltered(
  colorFilter: ColorFilter.mode(
    Color.fromARGB(255, colorsValue.round(), colorsValue.round(), colorsValue.round()),
    BlendMode.colorDodge,
  ),
  child: Image.asset(lists[index]),
);

功能四:平铺效果:

组件:

Container: 用于包裹平铺效果的图片。

属性和方法:

DecorationImage的repeat属性: 设置图片在容器中的重复方式。

round()方法: 将浮点数四舍五入为最接近的整数。

Container(
  width: MediaQuery.of(context).size.width,
  height: MediaQuery.of(context).size.height / 3,
  color: Colors.amberAccent,
  child: Container(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage(lists[index]),
        repeat: ImageRepeat.repeat,
      ),
    ),
  ),
);

功能五:颜色调整:

组件:

Slider: 用于提供滑动条以调整颜色值。

属性和方法:

value属性: 表示当前滑块的值。

min和max属性: 设置滑块的最小和最大值。

onChanged回调: 在滑动条值变化时触发的函数。

Slider(
  value: colorsValue,
  min: 0,
  max: 255,
  onChanged: (value) {
    setState(() {
      colorsValue = value;
    });
  },
);

功能六:图片切换 :

组件:

ElevatedButton: 用于显示提升的按钮。

属性和方法:

onPressed回调: 在按钮被点击时触发的函数。

ElevatedButton(
  child: Text('向前'),
  onPressed: () {
    setState(() {
      if (index > 0) index--;
    });
  },
);
ElevatedButton(
   child: Text('向后'),
      onPressed: () {
         setState(() {
         if (index < lists.length - 1) index++;
      });
   },
),

功能七:拉伸图片

组件:

Container 组件:

用途: 用于创建一个矩形的可视容器,可以包含子组件,并设置容器的样式和尺寸。

相关属性:

width:容器的宽度,设置为屏幕的宽度。

height:容器的高度,设置为屏幕高度的三分之一。

color:容器的颜色,设置为 Colors.amberAccent

Image.asset 组件:

用途: 用于显示应用内的图片资源。

相关属性:

lists[index]:图片的路径,从预定义的列表中选择。

fit:用于指定图片的填充方式,这里设置为 BoxFit.fill,表示填充整个容器。

mgContainer = Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height / 3,
        color: Colors.amberAccent,
        child: Image.asset(
          lists[index],
          fit: BoxFit.fill,
        ),
      );

四 完整代码

import 'package:flutter/material.dart';
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  int? selected = 0; // 默认选中混色
  List<String> lists = ['images/p1.jpg', 'images/p2.jpg', 'images/p3.jpg', 'images/p4.jpg'];
  int index = 0;
  double colorsValue = 0.0;
  BoxFit fitType = BoxFit.fill; // 用于控制图片的填充方式
  @override
  Widget build(BuildContext context) {
    Container imgContainer;

    if (selected == 1) {
      // 如果是平铺效果,将 Image.asset 放在 Container 中
      imgContainer = Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height / 3,
        color: Colors.amberAccent,
        child: Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage(lists[index]),
              repeat: ImageRepeat.repeat,
            ),
          ),
        ),
      );
    } else if (selected == 2) {
      // 如果是拉伸原图,将图片的填充方式设置为拉伸
      imgContainer = Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height / 3,
        color: Colors.amberAccent,
        child: Image.asset(
          lists[index],
          fit: BoxFit.fill,
        ),
      );
    } else {
      // 否则应用混色效果
      imgContainer = Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height / 3,
        color: Colors.amberAccent,
        child: ColorFiltered(
          colorFilter: ColorFilter.mode(
            Color.fromARGB(255, colorsValue.round(), colorsValue.round(), colorsValue.round()),
            BlendMode.colorDodge,
          ),
          child: Image.asset(
            lists[index],
            fit: fitType, // 使用BoxFit属性来控制图片的填充方式
          ),
        ),
      );
    }

    return Scaffold(
      body: Column(
        children: <Widget>[
          imgContainer,
          RadioListTile(
            value: 0,
            groupValue: selected,
            title: Text('混色'),
            subtitle: Slider(
              value: colorsValue,
              min: 0,
              max: 255,
              onChanged: (value) {
                setState(() {
                  colorsValue = value;
                });
              },
            ),
            onChanged: (value) {
              setState(() {
                selected = value ?? 0;
                fitType = BoxFit.fill; // 选择混色时,将图片的填充方式设置为拉伸
              });
            },
          ),
          RadioListTile(
            value: 1,
            groupValue: selected,
            title: Text('平铺'),
            subtitle: Text('按XY方向平铺在显示区域'),
            onChanged: (value) {
              setState(() {
                selected = value ?? 0;
                fitType = BoxFit.fill; // 选择平铺时,将图片的填充方式设置为拉伸
              });
            },
          ),
          RadioListTile(
            value: 2,
            groupValue: selected,
            title: Text('拉伸原图'), // 选择拉伸原图时,将图片的填充方式设置为拉伸
            onChanged: (value) {
              setState(() {
                selected = value ?? 0;
                fitType = BoxFit.fill;
              });
            },
          ),
          RadioListTile(
            value: 3,
            groupValue: selected,
            title: Text('显示原图'), // 新增:显示原图
            onChanged: (value) {
              setState(() {
                selected = value ?? 0;
                fitType = BoxFit.contain; // 选择显示原图时,将图片的填充方式设置为保持宽高比适应容器
              });
            },
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              ElevatedButton(
                child: Text('向前'),
                onPressed: () {
                  setState(() {
                    if (index > 0) index--;
                  });
                },
              ),
              ElevatedButton(
                child: Text('向后'),
                onPressed: () {
                  setState(() {
                    if (index < lists.length - 1) index++;
                  });
                },
              ),
            ],
          ),
        ],
      ),
    );
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/188573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生智慧校园 Web 3D 可视化监测

当今&#xff0c;智慧校园发展阶段亟需推动信息可视化建设与发展&#xff0c;将大数据、云计算、可视化等高新技术相融合&#xff0c;为校园师生创造科学智能的学习环境&#xff0c;并实现教学资源最大化和信息服务智能化。帮助学校更好地应用校园可视化技术&#xff0c;提升校…

rfc4301- IP 安全架构

1. 引言 1.1. 文档内容摘要 本文档规定了符合IPsec标准的系统的基本架构。它描述了如何为IP层的流量提供一组安全服务&#xff0c;同时适用于IPv4 [Pos81a] 和 IPv6 [DH98] 环境。本文档描述了实现IPsec的系统的要求&#xff0c;这些系统的基本元素以及如何将这些元素结合起来…

Jensen不等式

如果是正数&#xff0c;并且它们的和等于1&#xff0c;f是凸函数&#xff0c;那么&#xff1a; 也可表述为&#xff1a; 即x期望的凸函数值小于等于x凸函数值的期望

【数据库】聊聊一颗B+树 可以存储多少数据

我们知道数据库使用的数据结构是B树&#xff0c;但是B树可以存储多少数据呢&#xff0c;在面试中也是经常会问的问题&#xff0c;所以我们从根上理解这个问题。 操作系统层面 数据都是存储在磁盘中的&#xff0c;而磁盘中的数据都是以最新单位扇区进行分割。一个扇区的大小是…

STM32 CAN协议讲解以及代码

STM32 CAN 文章目录 STM32 CAN前言一、CAN外设1.主控制寄存器CAN_MCR2.位时序寄存器CAN_BTR3.CAN的发送邮箱4.CAN的接收FIFO5.验收筛选器 二、代码配置1.初始化2.发送数据3.接收数据4.main.c 前言 前面学习了CAN的一些理论知识&#xff0c;他在我们的STM32里面是怎么用的呢 前…

vue3+elementPlus之侧边菜单栏功能

选择默认的颜色&#xff0c;将代码拷贝至<el-aside>模块中 稍微把不需要的修改一下。 <template><div class"common-layout"><el-container><el-header class"homeHeader"><div class"headerTitle">Devops…

2023年【安全员-C证】考试试卷及安全员-C证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试试卷是安全生产模拟考试一点通生成的&#xff0c;安全员-C证证模拟考试题库是根据安全员-C证最新版教材汇编出安全员-C证仿真模拟考试。2023年【安全员-C证】考试试卷及安全员-C证试题及解析 1、【多选…

基于uQRCode封装的Vue3二维码生成插件

标题&#xff1a;基于uQRCode封装的Vue3二维码生成插件 摘要&#xff1a;本文介绍了一种基于uQRCode封装的Vue3二维码生成插件&#xff0c;可以在Javascript运行环境下生成二维码并返回图片地址。该插件适用于所有Javascript运行环境&#xff0c;并且支持微信小程序。本文将详…

springboot+vue项目如何集成onlyoffice开源文档组件

一、onlyoffice是什么 ONLYOFFICE 是一个开源的办公套件&#xff0c;适合多人在线协作。由总部位于总部在拉脱维亚的 IT 公司Acensio System SIA 开发。它提供在线协作文档编辑器&#xff08;包括文档、电子表格、演示文稿和表单&#xff09;&#xff0c;适用于 Windows、Linu…

Jenkins用126邮箱发邮件为什么发不出去

1、检查 Jenkins Location中的邮件地址配置与发邮件的地址配置是否一致 Manage Jenkins -》 system 2、检查地址和端口号 3、检查邮箱的登录配置是否正确&#xff08;这个地方的配置方式网上一抓一大把&#xff0c;自己搜一下就好&#xff09; 4、126邮箱发邮件不需要勾选ssl协…

QXDM Filter使用指南

QXDM Filter使用指南 1. QXDM简介2 如何制作和导入Filter2.1 制作Filter2.1.1 制作Windows环境下Filter2.1.2 制作Linux环境下Filter 2.2 Windows环境下导入Filter 3 Filter配置3.1 注册拨号问题3.1.1 LOG Packets(OTA)3.1.2 LOG Packets3.1.3 Event Reports3.1.4 Message Pack…

033.Python面向对象_类补充_生命周期

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Java学习路径:入门学习、深入学习、核心技术,操作案例和实际代码示例

学习路径&#xff1a;入门学习、深入学习、核心技术&#xff0c; 每个主题都包括很多的操作案例和实际代码示例。 a. 入门学习&#xff1a; 1. 基础语法&#xff1a; 变量和数据类型&#xff1a; // 定义和初始化变量 int age 25;// 不同数据类型的声明 double price 19.99…

智能汽车十大网络安全攻击场景-《智能汽车网络安全权威指南》

引言 大家都很熟悉OWASP Top 10风险报告&#xff0c;这个报告不但总结了Web应用程序最可能、最常见、最危险的10大安全隐患&#xff0c;还包括了如何消除这些隐患的建议&#xff0c;这个“OWASP Top 10“差不多每隔三年更新一次。目前汽车网络安全攻击威胁隐患繁多&#xff0c…

AI绘画“湿地公园的美女”

1、AI绘画&#xff1a;湿地公园的美女 通过输入描述&#xff1a;你需要什么场景的什么创作内容&#xff0c;AI根据内容创造出适合的主题 如图所示&#xff1a;请帮我创作一个湿地公园的像高圆圆的美女图片。 输出的结果如下&#xff1a;总体来说感觉还是非常快&#xff0c;基…

python pip安装第三方包时报错 error: Microsoft Visual C++ 14.0 or greater is required.

文章目录 1.问题2.原因3.解决办法 1.问题 pip install 的时候报错一大堆&#xff0c;其中有这么一段话 &#x1f447; error: Microsoft Visual C 14.0 or greater is required. Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visua…

Proteus仿真--用DS1302与12864LCD设计的可调式中文电子日历

本文主要介绍用DS1302和12864 LCD的可调式中文电子日历&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中12864LCD上面显示中文年月日信息时间信息&#xff0c;按键K1-K4&#xff0c;K1用于年月日时分选择&#xff0c;K2用于加功能&#xff0c;K3用于…

基于时隙的多重冗余流指纹模型

文章信息 论文题目&#xff1a;基于时隙的多重冗余流指纹模型 期刊&#xff08;会议&#xff09;&#xff1a;网络与信息安全学报 时间&#xff1a;2023 级别&#xff1a;CCF C 概述 为确保内生网络流量安全可信&#xff0c;本文在研究流水印及其扩展的流指纹机制的基础上&a…

Docker的学习笔记

1.1 docker的介绍 1.2 docker的一次安装 //如果是root用户&#xff0c;不加sudo也行curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -echo deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable…

【限流配电开关】TPS2001C

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…