DecoratedBox

DecoratedBox可以在其子widget绘制前(或后)绘制一个装饰Decoration(如背景、边框、渐变等)。DecoratedBox定义如下:

  1. const DecoratedBox({
  2. Decoration decoration,
  3. DecorationPosition position = DecorationPosition.background,
  4. Widget child
  5. })
  • decoration:代表将要绘制的装饰,它类型为Decoration,Decoration是一个抽象类,它定义了一个接口 createBoxPainter(),子类的主要职责是需要通过实现它来创建一个画笔,该画笔用于绘制装饰。
  • position:此属性决定在哪里绘制Decoration,它接收DecorationPosition的枚举类型,该枚举类两个值:
    • background:在子widget之后绘制,及背景装饰。
    • foreground:在子widget之上绘制,及前景。

BoxDecoration

我们通常会直接使用BoxDecoration,它是一个Decoration的子类,实现了常用的装饰元素的绘制。

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

各个属性名都是自解释的,详情读者可以查看API文档,我们看一个示例:

  1. DecoratedBox(
  2. decoration: BoxDecoration(
  3. gradient: LinearGradient(colors:[Colors.red,Colors.orange[700]]), //背景渐变
  4. borderRadius: BorderRadius.circular(3.0), //3像素圆角
  5. boxShadow: [ //阴影
  6. BoxShadow(
  7. color:Colors.black54,
  8. offset: Offset(2.0,2.0),
  9. blurRadius: 4.0
  10. )
  11. ]
  12. ),
  13. child: Padding(padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
  14. child: Text("Login", style: TextStyle(color: Colors.white),),
  15. )
  16. )

效果如下:

image-20180910115903588

怎么样,通过BoxDecoration,我们实现了一个渐变按钮的外观,但此示例还不是一个标准的按钮,因为它还不能响应点击事件,我们将在本章末尾来实现一个完整的GradientButton。