#flutter #user-interface #dart #flutter-layout
#flutter #пользовательский интерфейс #dart #flutter-layout
Вопрос:
Привет, ребята, я хотел бы спросить, возможно ли достичь такого дизайна с помощью кода? Я действительно застрял, вот дизайн, которого я хотел бы достичь
но настоящая проблема в том, что я достигаю только этого
это мой пример кода:
в моем основном:
return Scaffold(
backgroundColor: Color(0xff012a60),
body: Stack(children: <Widget>[
/*_AnimatedCircle(
outerController: outerController,
innerController: innerController,
),*/
_OuterCircle(circleColor: Colors.blueGrey[900].withOpacity(.8)),
Column(children: <Widget>[
const Spacer(flex: 50),
Expanded(flex: 30, child: Container(color: Colors.white)),
const Spacer(flex: 20),
]),
Row(children: <Widget>[
const Spacer(flex: 80),
Transform.scale(
scale: 2.5,
child: Container(
width: MediaQuery.of(context).size.width * 0.2,
decoration: const BoxDecoration(
color: Colors.red, shape: BoxShape.circle)),
),
]),
// _OuterCircle(circleColor: Colors.blueAccent.withOpacity(.25)),
Row(children: <Widget>[
const Spacer(flex: 80),
Column(children: [
Spacer(flex: 60),
Transform.scale(
scale: 2.5,
child: Container(
width: MediaQuery.of(context).size.width * 0.2,
height: MediaQuery.of(context).size.width * 0.05,
decoration: const BoxDecoration(color: Colors.green)),
),
Spacer(flex: 24),
]),
]),
]),
);
и это мой другой класс
class _OuterCircle extends StatelessWidget {
const _OuterCircle({Key key, this.circleColor}) : super(key: key);
final Color circleColor;
@override
Widget build(BuildContext context) {
return Transform.scale(
scale: 2,
child: Container(
width: MediaQuery.of(context).size.width * 0.47,
decoration: BoxDecoration(shape: BoxShape.circle, color: circleColor),
));
}
}
Пожалуйста, помогите, я действительно застрял, как добиться такого дизайна в коде dart
Ответ №1:
Я думаю, что проще разбить проблему геометрии с самой большой области на небольшую область.
Ключевым моментом для достижения этого является использование Clip
(ClipOval, clipRect …)
- Верхнюю часть можно нарисовать, используя правый круг для обрезки левого круга
- Нижнюю часть можно нарисовать, используя правый круг для обрезки внутреннего прямоугольника
- Масштабирование области стека
- Нарисуйте большой левый круг (область 1)
- Нарисуйте средний белый прямоугольник (область 2)
- Нарисуйте правильный круг с прямоугольником внутри (область 3)
- Нарисуйте среднюю часть пересечения (область 4)
Используемые виджеты: ClipOval
, FractionallySizedBox
, AspectRatio
,
Левый большой круг
class BigCircle extends StatelessWidget {
const BigCircle({this.color,Key key}):super(key: key);
final Color color;
@override
Widget build(BuildContext context) {
return AspectRatio(
aspectRatio: 1,
child: Container(
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle,
),
),
);
}
}
Пользовательский овальный клипер (обрезать правую область белого круга)
class CustomClipOval extends CustomClipper<Rect> {
@override
Rect getClip(Size size) {
final width = size.width * 0.42;
return Rect.fromLTRB(
size.width - width,
(size.height - width) * 0.5,
size.width,
(size.height width) * 0.5,
);
}
@override
bool shouldReclip(covariant CustomClipper<Rect> oldClipper) {
return false;
}
}
Наконец, стек
return Scaffold(
backgroundColor: const Color(0xff004471),
body: Transform.scale(
scale: 1.19,
child: Stack(children: <Widget>[
// Area 1
const Align(
alignment: Alignment.centerLeft,
child: BigCircle(
color: Color(0xff022c66),
),
),
// Area 2
Align(
alignment: const Alignment(0, 0.4),
child: FractionallySizedBox(
heightFactor: 0.23,
child: Container(
color: Colors.white,
),
),
),
// Area 3
ClipOval(
clipper: CustomClipOval(),
child: Container(
alignment: const Alignment(0, 0.46),
color: Colors.white,
child: FractionallySizedBox(
heightFactor: 0.14,
child: Container(
color: const Color(0xff335f86),
),
),
),
),
// Area 4
ClipOval(
clipper: CustomClipOval(),
child: const Align(
alignment: Alignment.centerLeft,
child: BigCircle(color: Color(0xff647294),),
),
),
]),
),
);
Комментарии:
1. здравствуйте, спасибо за ответ, я хотел бы спросить, как насчет той части, прямоугольник которой имеет кривую? какой у меня круг на картинке? Мне нужен был край кривой, как мне этого добиться?
2. Я оборачиваю весь прямоугольник внутри
ClipOval
области 3. Прямоугольник из круга будет вырезан.3. Большое спасибо за вашу помощь, действительно помог мой день, плюс небольшая настройка, после чего все готово