当前位置:   article > 正文

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

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 对象才会被创建。这有助于优化应用性能。

  1. class MyHomePage extends StatefulWidget {
  2. @override
  3. _MyHomePageState createState() => _MyHomePageState();
  4. }

功能实现:

功能一:图片展示:

组件:

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

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

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

属性和方法:

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

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

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

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

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

  1. Container imgContainer = Container(
  2. width: MediaQuery.of(context).size.width,
  3. height: MediaQuery.of(context).size.height / 3,
  4. color: Colors.amberAccent,
  5. child: Container(
  6. decoration: BoxDecoration(
  7. image: DecorationImage(
  8. image: AssetImage(lists[index]),
  9. repeat: ImageRepeat.repeat,
  10. ),
  11. ),
  12. ),
  13. );

功能二:效果选择 :

组件:

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

属性和方法:

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

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

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

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

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

  1. RadioListTile(
  2. value: 0,
  3. groupValue: selected,
  4. title: Text('混色'),
  5. subtitle: Slider(
  6. value: colorsValue,
  7. min: 0,
  8. max: 255,
  9. onChanged: (value) {
  10. setState(() {
  11. colorsValue = value;
  12. });
  13. },
  14. ),
  15. onChanged: (value) {
  16. setState(() {
  17. selected = value ?? 0;
  18. });
  19. },
  20. );

功能三:混色效果 :

组件:

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

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

属性和方法:

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

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

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

  1. ColorFiltered(
  2. colorFilter: ColorFilter.mode(
  3. Color.fromARGB(255, colorsValue.round(), colorsValue.round(), colorsValue.round()),
  4. BlendMode.colorDodge,
  5. ),
  6. child: Image.asset(lists[index]),
  7. );

功能四:平铺效果:

组件:

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

属性和方法:

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

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

  1. Container(
  2. width: MediaQuery.of(context).size.width,
  3. height: MediaQuery.of(context).size.height / 3,
  4. color: Colors.amberAccent,
  5. child: Container(
  6. decoration: BoxDecoration(
  7. image: DecorationImage(
  8. image: AssetImage(lists[index]),
  9. repeat: ImageRepeat.repeat,
  10. ),
  11. ),
  12. ),
  13. );

功能五:颜色调整:

组件:

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

属性和方法:

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

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

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

  1. Slider(
  2. value: colorsValue,
  3. min: 0,
  4. max: 255,
  5. onChanged: (value) {
  6. setState(() {
  7. colorsValue = value;
  8. });
  9. },
  10. );

功能六:图片切换 :

组件:

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

属性和方法:

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

  1. ElevatedButton(
  2. child: Text('向前'),
  3. onPressed: () {
  4. setState(() {
  5. if (index > 0) index--;
  6. });
  7. },
  8. );
  9. ElevatedButton(
  10. child: Text('向后'),
  11. onPressed: () {
  12. setState(() {
  13. if (index < lists.length - 1) index++;
  14. });
  15. },
  16. ),

功能七:拉伸图片

组件:

Container 组件:

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

相关属性:

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

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

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

Image.asset 组件:

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

相关属性:

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

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

  1. mgContainer = Container(
  2. width: MediaQuery.of(context).size.width,
  3. height: MediaQuery.of(context).size.height / 3,
  4. color: Colors.amberAccent,
  5. child: Image.asset(
  6. lists[index],
  7. fit: BoxFit.fill,
  8. ),
  9. );

四 完整代码

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(MyApp());
  4. }
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: MyHomePage(),
  10. );
  11. }
  12. }
  13. class MyHomePage extends StatefulWidget {
  14. @override
  15. _MyHomePageState createState() => _MyHomePageState();
  16. }
  17. class _MyHomePageState extends State<MyHomePage> {
  18. int? selected = 0; // 默认选中混色
  19. List<String> lists = ['images/p1.jpg', 'images/p2.jpg', 'images/p3.jpg', 'images/p4.jpg'];
  20. int index = 0;
  21. double colorsValue = 0.0;
  22. BoxFit fitType = BoxFit.fill; // 用于控制图片的填充方式
  23. @override
  24. Widget build(BuildContext context) {
  25. Container imgContainer;
  26. if (selected == 1) {
  27. // 如果是平铺效果,将 Image.asset 放在 Container 中
  28. imgContainer = Container(
  29. width: MediaQuery.of(context).size.width,
  30. height: MediaQuery.of(context).size.height / 3,
  31. color: Colors.amberAccent,
  32. child: Container(
  33. decoration: BoxDecoration(
  34. image: DecorationImage(
  35. image: AssetImage(lists[index]),
  36. repeat: ImageRepeat.repeat,
  37. ),
  38. ),
  39. ),
  40. );
  41. } else if (selected == 2) {
  42. // 如果是拉伸原图,将图片的填充方式设置为拉伸
  43. imgContainer = Container(
  44. width: MediaQuery.of(context).size.width,
  45. height: MediaQuery.of(context).size.height / 3,
  46. color: Colors.amberAccent,
  47. child: Image.asset(
  48. lists[index],
  49. fit: BoxFit.fill,
  50. ),
  51. );
  52. } else {
  53. // 否则应用混色效果
  54. imgContainer = Container(
  55. width: MediaQuery.of(context).size.width,
  56. height: MediaQuery.of(context).size.height / 3,
  57. color: Colors.amberAccent,
  58. child: ColorFiltered(
  59. colorFilter: ColorFilter.mode(
  60. Color.fromARGB(255, colorsValue.round(), colorsValue.round(), colorsValue.round()),
  61. BlendMode.colorDodge,
  62. ),
  63. child: Image.asset(
  64. lists[index],
  65. fit: fitType, // 使用BoxFit属性来控制图片的填充方式
  66. ),
  67. ),
  68. );
  69. }
  70. return Scaffold(
  71. body: Column(
  72. children: <Widget>[
  73. imgContainer,
  74. RadioListTile(
  75. value: 0,
  76. groupValue: selected,
  77. title: Text('混色'),
  78. subtitle: Slider(
  79. value: colorsValue,
  80. min: 0,
  81. max: 255,
  82. onChanged: (value) {
  83. setState(() {
  84. colorsValue = value;
  85. });
  86. },
  87. ),
  88. onChanged: (value) {
  89. setState(() {
  90. selected = value ?? 0;
  91. fitType = BoxFit.fill; // 选择混色时,将图片的填充方式设置为拉伸
  92. });
  93. },
  94. ),
  95. RadioListTile(
  96. value: 1,
  97. groupValue: selected,
  98. title: Text('平铺'),
  99. subtitle: Text('按XY方向平铺在显示区域'),
  100. onChanged: (value) {
  101. setState(() {
  102. selected = value ?? 0;
  103. fitType = BoxFit.fill; // 选择平铺时,将图片的填充方式设置为拉伸
  104. });
  105. },
  106. ),
  107. RadioListTile(
  108. value: 2,
  109. groupValue: selected,
  110. title: Text('拉伸原图'), // 选择拉伸原图时,将图片的填充方式设置为拉伸
  111. onChanged: (value) {
  112. setState(() {
  113. selected = value ?? 0;
  114. fitType = BoxFit.fill;
  115. });
  116. },
  117. ),
  118. RadioListTile(
  119. value: 3,
  120. groupValue: selected,
  121. title: Text('显示原图'), // 新增:显示原图
  122. onChanged: (value) {
  123. setState(() {
  124. selected = value ?? 0;
  125. fitType = BoxFit.contain; // 选择显示原图时,将图片的填充方式设置为保持宽高比适应容器
  126. });
  127. },
  128. ),
  129. Row(
  130. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  131. children: <Widget>[
  132. ElevatedButton(
  133. child: Text('向前'),
  134. onPressed: () {
  135. setState(() {
  136. if (index > 0) index--;
  137. });
  138. },
  139. ),
  140. ElevatedButton(
  141. child: Text('向后'),
  142. onPressed: () {
  143. setState(() {
  144. if (index < lists.length - 1) index++;
  145. });
  146. },
  147. ),
  148. ],
  149. ),
  150. ],
  151. ),
  152. );
  153. }
  154. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/268771
推荐阅读
相关标签
  

闽ICP备14008679号