您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

172 行
7.4 KiB

using System.Collections.Generic;
using System.Linq;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.material;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using Unity.UIWidgets.widgets;
using TextStyle = Unity.UIWidgets.painting.TextStyle;
namespace UIWidgetsGallery.gallery {
class ColorDemoConstants {
public const float kColorItemHeight = 48.0f;
public static readonly List<Palette> allPalettes = new List<Palette> {
new Palette(name: "RED", primary: Colors.red, accent: Colors.redAccent, threshold: 300),
new Palette(name: "PINK", primary: Colors.pink, accent: Colors.pinkAccent, threshold: 200),
new Palette(name: "PURPLE", primary: Colors.purple, accent: Colors.purpleAccent, threshold: 200),
new Palette(name: "DEEP PURPLE", primary: Colors.deepPurple, accent: Colors.deepPurpleAccent,
threshold: 200),
new Palette(name: "INDIGO", primary: Colors.indigo, accent: Colors.indigoAccent, threshold: 200),
new Palette(name: "BLUE", primary: Colors.blue, accent: Colors.blueAccent, threshold: 400),
new Palette(name: "LIGHT BLUE", primary: Colors.lightBlue, accent: Colors.lightBlueAccent, threshold: 500),
new Palette(name: "CYAN", primary: Colors.cyan, accent: Colors.cyanAccent, threshold: 600),
new Palette(name: "TEAL", primary: Colors.teal, accent: Colors.tealAccent, threshold: 400),
new Palette(name: "GREEN", primary: Colors.green, accent: Colors.greenAccent, threshold: 500),
new Palette(name: "LIGHT GREEN", primary: Colors.lightGreen, accent: Colors.lightGreenAccent,
threshold: 600),
new Palette(name: "LIME", primary: Colors.lime, accent: Colors.limeAccent, threshold: 800),
new Palette(name: "YELLOW", primary: Colors.yellow, accent: Colors.yellowAccent),
new Palette(name: "AMBER", primary: Colors.amber, accent: Colors.amberAccent),
new Palette(name: "ORANGE", primary: Colors.orange, accent: Colors.orangeAccent, threshold: 700),
new Palette(name: "DEEP ORANGE", primary: Colors.deepOrange, accent: Colors.deepOrangeAccent,
threshold: 400),
new Palette(name: "BROWN", primary: Colors.brown, threshold: 200),
new Palette(name: "GREY", primary: Colors.grey, threshold: 500),
new Palette(name: "BLUE GREY", primary: Colors.blueGrey, threshold: 500),
};
}
public class Palette {
public Palette(string name = null, MaterialColor primary = null, MaterialAccentColor accent = null,
int threshold = 900) {
this.name = name;
this.primary = primary;
this.accent = accent;
this.threshold = threshold;
}
public readonly string name;
public readonly MaterialColor primary;
public readonly MaterialAccentColor accent;
public readonly int threshold;
public bool isValid {
get { return this.name != null && this.primary != null; }
}
}
public class ColorItem : StatelessWidget {
public ColorItem(
Key key = null,
int? index = null,
Color color = null,
string prefix = ""
) : base(key: key) {
D.assert(index != null);
D.assert(color != null);
D.assert(prefix != null);
this.index = index;
this.color = color;
this.prefix = prefix;
}
public readonly int? index;
public readonly Color color;
public readonly string prefix;
string colorString() {
return $"#{this.color.value.ToString("X8").ToUpper()}";
}
public override Widget build(BuildContext context) {
return new Container(
height: ColorDemoConstants.kColorItemHeight,
padding: EdgeInsets.symmetric(horizontal: 16.0f),
color: this.color,
child: new SafeArea(
top: false,
bottom: false,
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: new List<Widget> {
new Text($"{this.prefix}{this.index}"),
new Text(this.colorString())
}
)
)
);
}
}
public class PaletteTabView : StatelessWidget {
public PaletteTabView(
Key key = null,
Palette colors = null
) : base(key: key) {
D.assert(colors != null && colors.isValid);
this.colors = colors;
}
public readonly Palette colors;
public readonly static List<int> primaryKeys = new List<int> {50, 100, 200, 300, 400, 500, 600, 700, 800, 900};
public readonly static List<int> accentKeys = new List<int> {100, 200, 400, 700};
public override Widget build(BuildContext context) {
TextTheme textTheme = Theme.of(context).textTheme;
TextStyle whiteTextStyle = textTheme.body1.copyWith(color: Colors.white);
TextStyle blackTextStyle = textTheme.body1.copyWith(color: Colors.black);
List<Widget> colorItems = primaryKeys.Select<int, Widget>((int index) => {
return new DefaultTextStyle(
style: index > this.colors.threshold ? whiteTextStyle : blackTextStyle,
child: new ColorItem(index: index, color: this.colors.primary[index])
);
}).ToList();
if (this.colors.accent != null) {
colorItems.AddRange(accentKeys.Select<int, Widget>((int index) => {
return new DefaultTextStyle(
style: index > this.colors.threshold ? whiteTextStyle : blackTextStyle,
child: new ColorItem(index: index, color: this.colors.accent[index], prefix: "A")
);
}).ToList());
}
return new ListView(
itemExtent: ColorDemoConstants.kColorItemHeight,
children: colorItems
);
}
}
public class ColorsDemo : StatelessWidget {
public const string routeName = "/colors";
public override Widget build(BuildContext context) {
return new DefaultTabController(
length: ColorDemoConstants.allPalettes.Count,
child: new Scaffold(
appBar: new AppBar(
elevation: 0.0f,
title: new Text("Colors"),
bottom: new TabBar(
isScrollable: true,
tabs: ColorDemoConstants.allPalettes
.Select<Palette, Widget>((Palette swatch) => new Tab(text: swatch.name)).ToList()
)
),
body: new TabBarView(
children: ColorDemoConstants.allPalettes.Select<Palette, Widget>((Palette colors) => {
return new PaletteTabView(colors: colors);
}).ToList()
)
)
);
}
}
}