一、装饰容器
DecoratedBox
DecoratedBox 可以在其子组件绘制前(或后)绘制一些装饰(Decoration),如背景、边框、渐变等。DecoratedBox 定义如下:
const DecoratedBox({
Decoration decoration,
DecorationPosition position = DecorationPosition.background,
Widget child
})
- decoration:代表将要绘制的装饰,它的类型为 Decoration。Decoration 是一个抽象类,它定义了一个接口 createBoxPainter(),子类的主要职责是需要通过实现它来创建一个画笔,该画笔用于绘制装饰。
- position:此属性决定在哪里绘制 Decoration,它接收 DecorationPosition 的枚举类型,该枚举类有两个值:
- background:在子组件之后绘制,即背景装饰。
- foreground:在子组件之上绘制,即前景。
BoxDecoration
我们通常会直接使用 BoxDecoration 类,它是一个 Decoration 的子类,实现了常用的装饰元素的绘制。
BoxDecoration({
Color color, // 颜色
DecorationImage image, // 图片
BoxBorder border, // 边框
BorderRadiusGeometry borderRadius, // 圆角
List<BoxShadow> boxShadow, // 阴影,可以指定多个
Gradient gradient, // 渐变
BlendMode backgroundBlendMode, // 背景混合模式
BoxShape shape = BoxShape.rectangle, // 形状
})
示例:
DecoratedBox(
decoration: BoxDecoration(
gradient: LinearGradient(colors:[Colors.red,Colors.orange[700]]), // 背景渐变
borderRadius: BorderRadius.circular(3.0), // 3像素圆角
boxShadow: [ // 阴影
BoxShadow(
color: Colors.black54,
offset: Offset(2.0,2.0),
blurRadius: 4.0
)
]
),
child: Padding(padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
child: Text("Login", style: TextStyle(color: Colors.white),),
)
)
二、形状
BoxShape 用于定义盒子形状
BoxShape.rectangle
矩形BoxShape.circle
圆形
三、颜色
示例:
Colors.transparent // 透明
Colors.red // Colors.颜色名称, 同 Colors.red[500]
Colors.red[100] // 色彩深度, 取值 100-900, 整数100的倍数
Colors.grey.withOpacity(0.1) // 指定透明度
Color(0xccff0000) // Color(0xAARRGGBB)
Color.fromRGBO(255,0,0,.1) // Color.fromRGBO(R, G, B, O)
Color.fromARGB(.1,255,0,0) // Color.fromARGB(O, R, G, B)
四、透明度
Opacity 组件可以让子元素都保持同样的透明度
示例:
Opacity(
opacity: _visible ? 1.0 : 0.0, // 1 显示 0 隐藏
child: const Text('Now you see me, now you don\'t!'),
)
五、边框
Border 定义了边框样式, 可以是多边也可以是单边, BorderSide 定义单边颜色, 参数与 Border.all 一致
示例:
// 所有方向: Border.all(color, width, style)
Border.all(color: Color(0xffff0000), width: 1.0, style: BorderStyle.solid)
// 单方向
Border(
top: BorderSide(
color: Color(0xffff0000),
style: BorderStyle.solid,
width: 1
)
)
六、阴影
BoxShadow 的定义了阴影样式
示例:
BoxShadow({
Color color = const Color(0xFF000000),
Offset offset = Offset.zero,
double blurRadius = 0.0,
this.spreadRadius = 0.0,
})
示例:
BoxShadow(
color: Colors.red,
offset: Offset(2.0,2.0),
blurRadius: 8.0,
spreadRadius: 4.0
)
七、圆角
BorderRadius 定义了圆角样式, 常用方法有:
BorderRadius.circular(radius)
指定四个方向角的圆角值BorderRadius.all(Radius.circular(10))
指定四个方向角的圆角值BorderRadius.horizontal({Radius right, Radius left})
指定水平方向的圆角值BorderRadius.vertical({Radius top, Radius bottom})
指定垂直方向的圆角值BorderRadius.only({Radius right, Radius left, Radius top, Radius bottom})
指定四个方向的圆角值
示例:
BorderRadius.circular(10)
BorderRadius.all(Radius.circular(10))
BorderRadius.horizontal(right: Radius.circular(10), left: Radius.circular(30))
BorderRadius.vertical(top: Radius.circular(10), bottom: Radius.circular(30))
BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(20),
bottomLeft: Radius.circular(30),
bottomRight: Radius.circular(40)
)
八、渐变
线性渐变
LinearGradient 的定义:
LinearGradient({
this.begin = Alignment.centerLeft,
this.end = Alignment.centerRight,
@required List<Color> colors,
List<double> stops,
this.tileMode = TileMode.clamp,
})
示例:
LinearGradient(
colors: [Colors.red, Colors.lime],
begin: Alignment(-3, -3),
end: Alignment(2,2),
stops: [0.3, 1]
)
其中 stops 的长度需要与 colors 的长度匹配, 否则报错
径向渐变
RadialGradient 的定义:
RadialGradient({
this.center = Alignment.center,
this.radius = 0.5,
@required List<Color> colors,
List<double> stops,
this.tileMode = TileMode.clamp,
this.focal,
this.focalRadius = 0.0,
})
示例:
RadialGradient(
colors: [Colors.red, Colors.lime, Colors.green, Colors.amber],
stops: [0.1, 0.5, 1, 2],
radius: 2,
center: Alignment(0, 0),
)
梯度渐变
SweepGradient 的定义:
SweepGradient({
this.center = Alignment.center,
this.startAngle = 0.0,
this.endAngle = math.pi * 2,
@required List<Color> colors,
List<double> stops,
this.tileMode = TileMode.clamp,
})
示例:
SweepGradient(
colors: [Colors.red, Colors.green, Colors.blue],
stops: [.1, .4, 1],
startAngle: 0,
endAngle: 2 * pi
)