Flutter - DecoratedBox(装饰容器)及内部控件使用详解

news2024/9/25 15:29:10

DecoratedBox. 可以在其子组件绘制前(或后)绘制一些装饰(Decoration),如背景、边框、渐变等
比如 这样
在这里插入图片描述
这样
在这里插入图片描述
这样
在这里插入图片描述

// DecoratedBox 的源码 
const DecoratedBox({
    super.key,
    required this.decoration, // Decoration
    this.position = DecorationPosition.background, // DecorationPosition
    super.child,
  }) : assert(decoration != null), assert(position != null);

DecorationPosition
position:此属性决定在哪里绘制Decoration,它接收DecorationPosition的枚举类型,该枚举类有两个值:
background:在子组件之后绘制,即背景装饰。
foreground:在子组件之上绘制,即前景。

Decoration 主要用于装饰的类
在这里插入图片描述
原文翻译
一个框装饰的描述(一个应用于[Rect]的装饰)。
这个类提供了所有装饰的抽象接口。
具体示例参见[BoxDecoration]。
要实际绘制[装饰],使用[createBoxPainter]
方法获取[BoxPainter]。【装饰】对象可以
在盒子之间共享;[BoxPainter]对象可以缓存资源到
使绘画在特定的表面更快。

BoxDecoration

BoxDecoration({
  Color color, //颜色
  DecorationImage image,//图片
  BoxBorder border, //边框
  BorderRadiusGeometry borderRadius, //圆角
  List<BoxShadow> boxShadow, //阴影,可以指定多个
  Gradient gradient, //渐变
  BlendMode backgroundBlendMode, //背景混合模式
  BoxShape shape = BoxShape.rectangle, //形状
})

实例 1 属性 color + borderRadius

在这里插入图片描述

			Padding(
              padding: EdgeInsets.all(16),
              child: DecoratedBox(
                  decoration: BoxDecoration(
                      color:Colors.red,
                      borderRadius: BorderRadius.circular(15),//BorderRadius.all(Radius.circular(15))

                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
                    child: Text("Login", style: TextStyle(color: Colors.white),),
                  )
              ),
            ),

注 1 BorderRadius

BorderRadius extends BorderRadiusGeometry

BorderRadiusBorderRadiusGeometry的子类 ,通过BorderRadius来构建BoxDecoration的圆角
BorderRadius提供了一些便捷的方法

在这里插入图片描述

BorderRadius.all(Radius.circular(15))  // 四个角都是同一个值

在这里插入图片描述

BorderRadius.circular(15)  // 一种简便写法

在这里插入图片描述

BorderRadius.vertical(top:Radius.circular(5),bottom: Radius.circular(10))

horizontal 同理

实例 2 属性 image + borderRadius
在这里插入图片描述

			Padding(
              padding: EdgeInsets.all(10),
              child: DecoratedBox(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(15),//BorderRadius.all(Radius.circular(15))
                    image:DecorationImage(image: AssetImage("assets/images/caver.webp"),fit: BoxFit.fill),
                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
                    child: Text("Login", style: TextStyle(color: Colors.white),),
                  )
              ),
            ),

注 2 DecorationImage(image: AssetImage("assets/images/caver.webp"),fit: BoxFit.fill)

image  传入 图片即可

fit  图片的显示方式  BoxFit 是一个枚举

在这里插入图片描述

enum BoxFit {
  //通过扭曲源的纵横比来填充目标框
  fill,
  
  //对象中包含源文件的同时,使之尽可能大
  contain,

  // 尽可能小,同时仍然覆盖整个目标框。
  //要实际剪辑内容,请使用' clipBehavior: clip。hardEdge”与
  /// 这是一个[FittedBox]
  cover,

  //确保显示源的全宽度,无论如何 这是否意味着源垂直溢出目标框。
  //宽最大 ,忽视高,可能只显示一部分
  fitWidth,

  //同上 ,这个是保证高占满屏,宽度可能只有中间一部分
  fitHeight,

  //不错处理
  none,

 //在目标框内对齐源(默认为居中),如果必要时,缩小源代码以确保源代码适合盒。
 //这与' contains '相同,如果它会缩小图像,否则它会缩小图像与' none '相同。
  scaleDown,
}

实例3 borderRadius + border + color
在这里插入图片描述

			Padding(
              padding: EdgeInsets.all(10),
              child: DecoratedBox(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(15),//BorderRadius.all(Radius.circular(15))
                    border: Border.all(color: Colors.black,width: 2),
                    color: Colors.yellow[200],
                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
                    child: Text("Login", style: TextStyle(color: Colors.black),),
                  )
              ),
            ),

注 3 Border

源代码中 border 的属性是 BoxBorder
final BoxBorder? border;

// Border 为 BoxBorder的子类 
class Border extends BoxBorder 
Border 也提供了一些便捷的方法  这里用的是 all方法
 
const Border.symmetric({
    BorderSide vertical = BorderSide.none,
    BorderSide horizontal = BorderSide.none,
  })
  
const Border.fromBorderSide(BorderSide side)

factory Border.all({
    Color color = const Color(0xFF000000),
    double width = 1.0,
    BorderStyle style = BorderStyle.solid,
    StrokeAlign strokeAlign = StrokeAlign.inside,
  })

实例4 boxShadow + borderRadius + color

在这里插入图片描述

		 Padding(
              padding: EdgeInsets.all(10),
              child: DecoratedBox(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(115),//BorderRadius.all(Radius.circular(15))
                    // border: Border.all(color: Colors.black,width: 2),
                      color: Colors.yellow[200],
                    boxShadow: <BoxShadow>[BoxShadow(
                      color: Colors.green,
                      offset: Offset(12,12),
                      blurRadius: 18,

                    )]
                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
                    child: Text("Login4", style: TextStyle(color: Colors.black),),
                  )
              ),
            ),

注 4 BoxShadow

  // boxShadow 接收的是一个 list 所以可以有多个BoxShadow叠加显示
  final List<BoxShadow>? boxShadow; 

在这里插入图片描述

 	super.color,   // 阴影颜色
    super.offset,  // 偏移量
    super.blurRadius,  // 模糊度 (感觉这样形容比较贴切)
  final Offset offset; 

在这里插入图片描述

offset: Offset(12,12)  // 需要输入 x 和 y 的偏移量

实例5 borderRadius+ gradient(渐变)+boxShadow
在这里插入图片描述

			Padding(
              padding: EdgeInsets.all(10),
              child: DecoratedBox(
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(115),//BorderRadius.all(Radius.circular(15))
                      // border: Border.all(color: Colors.black,width: 2),
                      // color: Colors.yellow[200],
                      //colors: <Color>[Colors.red,Colors.green],
                    gradient:LinearGradient(colors:<Color>[Colors.red,Colors.green],
                        begin: Alignment.topLeft,end:  Alignment.centerLeft),
                      boxShadow: <BoxShadow>[BoxShadow(
                        color: Colors.black45,
                        offset: Offset(2,2),
                        blurRadius: 3,

                      )]
                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
                    child: Text("Login", style: TextStyle(color: Colors.black),),
                  )
              ),
            ),

注 5 gradient:LinearGradient

// gradient 是一个 	 Gradient
 final Gradient? gradient;

在这里插入图片描述
通过编辑器 可以看出来他有这三个 子类

在这里插入图片描述
通过看属性的类 ,在找子类的方法,看源码 ,发现,Flutter 所有不清楚的布局,点进去,找一找看一看 就懂了, 挺方便的, 不行就在翻译翻译注释 ,都解释的听清楚的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品新说 | 重磅,刚刚正式发布

在当代术加持和需求迭代的背景下&#xff0c;运维人员更需要透过现象看本质&#xff0c;也就是通过复杂的表象数据去挖掘其背后的信息价值。而运维数据经过各种技术手段的治理后&#xff0c;通常的呈现方式是数据空间的形式&#xff0c;比如表格、纯文字等。为了更形象地表达数…

层次遍历二叉树

层次遍历二叉树 文章目录层次遍历二叉树♥ 做法♥算法构思♥ 数据结构设计♥ 层次遍历过程♥ 算法实现应用:用层次遍历求路径之逆♥ 问题♥ 解题思路:♥ 算法框架&#xff1a;♥ 算法实现♥ 做法 ▪ 逐层进行访问 ▪ 对某一层的节点访问完后,再按照其访问次序对各个节点的左、…

[附源码]Python计算机毕业设计SSM基于的在线怀旧电影歌曲听歌系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MATLAB算法实战应用案例精讲-【神经网络】扩散模型(Diffusion Models)

前言 广播模型、扩散模型和传染模型可以用于分析信息、技术、行为、信念和传染病在人群中的传播。这些模型在通信科学、市场营销学和流行病学的研究中发挥着核心作用。 在计算机视觉中,生成模型是一类能够生成合成图像的模型。例如,一个被训练来生成人脸的模型,每次都会生…

Java项目:SSM电子书网站管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员、用户两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 登录页面,管理员管理书籍,用户管理等功能。 用户角色包含…

Docker学习笔记4(狂神)

DockerFile 很多官方镜像都是基础包&#xff0c;很多功能没有&#xff0c;我们通常会自己搭建自己的镜像&#xff01; 官方既然可以制作镜像&#xff0c;那我们也可以&#xff01; DockerFile的构建过程 很多指令&#xff1a; 创建一个自己的centos: 我们可以看到我们从docke…

代码随想录训练营第四天

专题&#xff1a;链表 题目&#xff1a;两两交换链表中的节点 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 例如&#xff1a; 题目分析 要两两交换链表中的结…

python opencv 找到圆点标定板所有点后通过距离找两个角点6

先对大图中的标定板框选&#xff0c;然后再标定计算 工程目录结构 如果提示没有win32gui则 pip install pywin32 如果是conda的环境则 conda install pywin32 drawROI.py import copy import jsonimport cv2 import numpy as np import os import matplotlib.pyplot as plt f…

【计算机视觉】Keras API和Tensorflow API的讲解(超详细必看)

觉得有帮助麻烦点赞关注收藏~~~ 一、Keras API Keras是一个用Python编写的高级神经网络API&#xff0c;它能够以Tensorflow、CNTK或者Theano作为后端运行&#xff0c;是一个模块化&#xff0c;最小化并且非常容易扩展的架构&#xff0c;它的开发者Francois Chollet说&#xff…

ESP32 ESP-IDF LVGL8.3.3 ST7735颜色修正

陈拓 2022/12/07-2022/12/10 1. 概述 在《ESP32 ESP-IDF LVGL8.3.3移植(ST7735)》 ESP32 ESP-IDF LVGL8.3.3移植_晨之清风的博客-CSDN博客ESP32 ESP-IDF LVGL8.3.3移植。https://blog.csdn.net/chentuo2000/article/details/128269394?spm1001.2014.3001.5502​​​​​​​…

Python 工匠 第四章 条件分支控制流

基础知识 分支惯用写法 没必要显式和布尔值比较&#xff0c;直接&#xff1a; if user.is_active:pass省略零值判断 if containers_count 0: --> if not containers_count: # 因为bool(0): False但是两者仍有不同 前者只有为0的时候才满足条件 后者则扩大到0, None, 空…

说说Vue-Router和Vue组件中的name属性的使用区别

目录 ⏬ Vue路由匹配规则routes中的name属性的使用 1. 指定页面路由&#xff0c;并传递参数 2. 获取组件的name值&#xff0c;以供页面使用 3. 同个路由&#xff0c;渲染多个视图 ⏬ vue组件中name的使用 1、组件递归操作 2、配合keep-alive对组件缓存做限制 3、在dev-to…

SpringBoot---错误处理机制

PostManHttp请求模拟工具&#xff0c;软件下载链接如下 PostMan下载链接 如果是其他客户端&#xff0c;默认响应一个JSON数据 原理-----SpirngMVC错误处理的自动配置 可以参照ErrorMvcAutoConfiguration&#xff1b;错误处理的自动配置&#xff1b; 给容器中添加了以下组件: …

基于51单片机的多功能电子时钟设计

设计任务&#xff1a; 1、设计任务&#xff1a;利用单片机、时钟芯片 DS1302、温度传感器 DS18B20、1602 液晶 等实现日期、时间、温度的显示即一个简单的万年历。 2、设计要求 &#xff08;1&#xff09;通过 DS1302 能够准确的计时&#xff0c;时间可调并在液晶上显示出来…

RK3568平台开发系列讲解(驱动基础篇)Linux内核面向对象思想之封装

🚀返回专栏总目录 文章目录 一、链表的抽象与封装二、设备管理模型的抽象与封装三、总线设备模型的抽象与封装沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux内核虽然是使用C语言实现的,但是内核中的很多子系统、模块在实现过程中处处体现了面向对象编程思想。…

动态规划:将题目转换为01背包问题

文章目录494. 目标和474. 一和零494. 目标和 力扣传送门&#xff1a; https://leetcode.cn/problems/target-sum/ 题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以…

easyrecovery2023最新免费版电脑数据恢复软件使用教程

easyrecovery2023版能实现多种不同格式的完成修复和进程的解决&#xff0c;能进行数据的操作和保存解决完成&#xff0c;通过不同的内容进行操作&#xff0c;能解决大部分的使用问题&#xff0c;能安全的进行保存。easyrecovery免安装版对于多种格式下的内容&#xff0c;能对多…

nacos注册中心和配置中心

nacos注册中心和配置中心 nacos 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 nacos官方文档&#xff1a;https://nacos.io/zh-cn/ 相关概念&#xff1a;https://nacos.io/zh-cn/docs/architecture.html nacos是AP架构,注重可用性和分区容错性&#…

腾讯云双十二服务器2核2G、2核4G、4核8G、8核16G、16核32G配置价格表出炉

现在腾讯云服务器2核2G、2核4G、4核8G、8核16G、16核32G配置价格表已经出来了&#xff0c;大家可以参考一下。腾讯云轻量应用服务器为轻量级的云服务器&#xff0c;使用门槛低&#xff0c;按套餐形式购买&#xff0c;轻量应用服务器套餐自带的公网带宽较大&#xff0c;4M、6M、…

​软件测试之“支付功能”测试

01 测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任何事物的测试思路都可以总结如下&#xff1a; 第一步&#xff1a;梳理产品的核心业务流程&#xff1a;明白这是个什么项目&#xff0c;实现了什么业务&#xff0c;以及是怎么实现的…