gpt4 book ai didi

Flutter - 如何制作具有固定高度的自定义圆形标签指示器?

转载 作者:行者123 更新时间:2023-12-03 20:10:39 25 4
gpt4 key购买 nike

我想制作一个圆形的指示器,如下图所示。

enter image description here

我为它尝试了很多,但我不能让它像设计一样形状。

还告诉我如何使用 flutter 制作分段可扩展的 ListView ? Design for listview

最佳答案

具有圆形形状的自定义指示器

您可以使用 CustomPainer

  final Paint paint = Paint();
paint.color = Color(0xff1967d2);
paint.style = PaintingStyle.fill;
canvas.drawRRect(
RRect.fromRectAndCorners(rect,
topRight: Radius.circular(8), topLeft: Radius.circular(8)),
paint);

看现场演示 here .

下面给出了完整的示例代码。
  import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: 4,
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("Demo page", style: TextStyle(
color: Colors.black87
),),
backgroundColor: Colors.white,
bottom: TabBar(
labelStyle: TextStyle(
fontWeight: FontWeight.w700
),
indicatorSize: TabBarIndicatorSize.label,
labelColor: Color(0xff1967d2),
unselectedLabelColor: Color(0xff5f6368),
isScrollable: true,
indicator: MD2Indicator(
indicatorSize: MD2IndicatorSize.full,
indicatorHeight: 8.0,
indicatorColor: Colors.green,
),
tabs: <Widget>[
Tab(
text: "Home",
),
Tab(
text: "Personal info",
),
Tab(
text: "Data & personalization",
),
Tab(
text: "Security",
)
],
),
),
)
,
),
);
}
}



enum MD2IndicatorSize {
tiny,
normal,
full,
}

class MD2Indicator extends Decoration {
final double indicatorHeight;
final Color indicatorColor;
final MD2IndicatorSize indicatorSize;

const MD2Indicator(
{@required this.indicatorHeight,
@required this.indicatorColor,
@required this.indicatorSize});

@override
_MD2Painter createBoxPainter([VoidCallback onChanged]) {
return new _MD2Painter(this, onChanged);
}
}

class _MD2Painter extends BoxPainter {
final MD2Indicator decoration;

_MD2Painter(this.decoration, VoidCallback onChanged)
: assert(decoration != null),
super(onChanged);

@override
void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
assert(configuration != null);
assert(configuration.size != null);

Rect rect;
if (decoration.indicatorSize == MD2IndicatorSize.full) {
rect = Offset(offset.dx,
(configuration.size.height - decoration.indicatorHeight ?? 3)) &
Size(configuration.size.width, decoration.indicatorHeight ?? 3);
} else if (decoration.indicatorSize == MD2IndicatorSize.normal) {
rect = Offset(offset.dx + 6,
(configuration.size.height - decoration.indicatorHeight ?? 3)) &
Size(configuration.size.width - 12, decoration.indicatorHeight ?? 3);
} else if (decoration.indicatorSize == MD2IndicatorSize.tiny) {
rect = Offset(offset.dx + configuration.size.width / 2 - 8,
(configuration.size.height - decoration.indicatorHeight ?? 3)) &
Size(16, decoration.indicatorHeight ?? 3);
}

final Paint paint = Paint();
paint.color = decoration.indicatorColor ?? Color(0xff1967d2);
paint.style = PaintingStyle.fill;
canvas.drawRRect(
RRect.fromRectAndCorners(rect,
topRight: Radius.circular(8), topLeft: Radius.circular(8)),
paint);
}
}

上面的片段取自这个包

https://pub.dev/packages/md2_tab_indicator

关于Flutter - 如何制作具有固定高度的自定义圆形标签指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60207392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com