Flutter时间轴

一,真实点,直接上图吧。

github地址
视频教学地址
在这里插入图片描述

1.位置,上图可见,时间轴可以在左边,也可以在中间,当然了可以在任何位置。
2.时间轴样式,当然了我们时间轴比仅仅限制为一个圆圈是吧,当然了你的部件能写多炫酷,砸门的时间轴也可以,上图(圆里面爱,图片,黄色背景文字,其实都是一长串部件)。
3.线,我们需要和内容的高度一样,这里估计是很多人的痛点,没法自适应,这里也做到了。线的粗细,颜色,虚线间隔,渐变...当然砸门也实现了

二 ,看一眼吧 如何实现。

群里很多人都需要一个时间轴,对于时间轴自适应高度难倒了很多人。当然了,我试着搞了搞,搞了两种思路, 
第一种有点low但是也能实现。我们知道Container是一个部件,它有一个decoration属性里面又一个  
boder,而且boder可以设置left,top,right,bootom等让其显示。
  • 1
  • 2
  • 3

代码如下:

 return Scaffold(
      body: ListView.builder(
        itemCount:10,
        itemBuilder:(context,index){
          return   Column(
            crossAxisAlignment:CrossAxisAlignment.start,
            children: <Widget>[
              Container(
                margin:EdgeInsets.only(left:10),
                height: 200,
                decoration: BoxDecoration(
                    border: Border(
                        left: BorderSide(
                          width: 3,
                          color: Colors.deepOrange,
                        ))),
                child:Text("内容"),
              ),
            ],
          );
        },

      ),
    );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

在这里插入图片描述

当然很low吧。我们可以看到绘制完成时候可以通过border来绘制边来画出线。其实到这里我想简单的时间轴不用我写了吧?
Colum(
圆圈,
容器(border),
圆圈
)
在这里插入图片描述

我们看看border源码:


  switch (left.style) {
    case BorderStyle.solid:
      paint.color = left.color;
      path.reset();
      path.moveTo(rect.left, rect.bottom);
      path.lineTo(rect.left, rect.top);
      if (left.width == 0.0) {
        paint.style = PaintingStyle.stroke;
      } else {
        paint.style = PaintingStyle.fill;
        path.lineTo(rect.left + left.width, rect.top + top.width);
        path.lineTo(rect.left + left.width, rect.bottom - bottom.width);
        path.lineTo(rect.left, rect.bottom);

      }
      canvas.drawPath(path, paint);
      break;
    case BorderStyle.none:
      break;
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

到这里我们可以发现,可以通过绘制边来进行时间轴的高度自适应,在Flutter里面又一个CustomPaint。因为画布可以知道部件自己的size那么我们就可以通过在canvas上画时间轴了。这样可以达到自适应。

下面关键代码:
通过CustomPaint来绘制时间线。设置绘制的各种样式。更加灵活相比与border

class MyPainterLeft extends CustomPainter {
  //虚线
  double DottedLineLenght;
  //虚线之间的间距
  double DottedSpacing;
  double circleSize;
  Gradient mygradient;
  bool isDash;
  Color LineColor;
  double paintWidth;
  MyPainterLeft(
      {this.circleSize,
        this.mygradient,
        this.isDash = false,
        this.DottedLineLenght = 5.0,
        this.DottedSpacing = 10.0,
        this.LineColor = Colors.redAccent,this.paintWidth=4});

  Paint _paint = Paint()
    ..strokeCap = StrokeCap.square //画笔笔触类型
    ..isAntiAlias = true;//是否启动抗锯齿//画笔的宽度
  Path _path = new Path();

  @override
  Future paint(Canvas canvas, Size size) {
    final Rect arcRect = Rect.fromLTWH(10, 5, 4, size.height);
    _paint.style = PaintingStyle.stroke; // 画线模式
    _paint.color = this.LineColor;
    _paint.strokeWidth=this.paintWidth;
    _path.moveTo(size.width, 0); // 移动起点到(20,40)
    _path.lineTo(size.width, size.height); // 画条斜线
    if (mygradient != null) {
      _paint.shader = mygradient.createShader(arcRect);
    }
    if (mygradient != null && isDash) {
      canvas.drawPath(
        dashPath(_path,
            dashArray: CircularIntervalList<double>(
                <double>[DottedLineLenght, DottedSpacing]),
            dashOffset: DashOffset.absolute(1)),
        _paint,
      );
    } else {
      canvas.drawPath(_path, _paint);
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

三,使用:

属性属性使用介绍是否必须
int index列表的index,用来搞定时间轴部件true
double timeAxisSize时间轴部件大小true
double contentLeft内容距离时间轴距离false
Widget leftWidget请展示你的技术时间轴部件false
double lineToLeft时间轴距屏幕左边距离false
Gradient mygradient时间轴线是否渐变false
bool isDash时间轴线是否是虚线 true or falsefalse
double DottedLineLenght虚线部分线段长度false
double DottedSpacing虚线间隔false
double marginLeft时间轴线开始画的起点。false
Alignment alignment时间轴显示的位置 leftcenter
Widget centerRightWidget如果时间轴在中间,左边内容false
Widget cententWight如果时间轴在中左边,中间的内容false
Widget centerLeftWidget如果时间轴在中间,右边内容false
double timeAxisLineWidth时间轴线的宽度false

1.pubspec.yaml里面
flutter_time_axis:
     git: https://github.com/luhenchang/flutter_time_axis.git

在这里插入图片描述
2.实例1:

在这里插入图片描述
在这里插入图片描述

其他的:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时光轴是一种将历史事件按时间线展示的方式。在Flutter中,可以通过使用ListView和Card来实现一个简单的时光轴。以下是一个示例: 1. 创建一个Flutter应用程序并打开main.dart文件。 2. 导入material.dart库并创建一个StatelessWidget。 ```dart import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Timeline App', home: TimelinePage(), ); } } ``` 3. 创建一个StatefulWidget并实现它的build方法。在build方法中,使用ListView和Card来展示历史事件。 ```dart class TimelinePage extends StatefulWidget { @override _TimelinePageState createState() => _TimelinePageState(); } class _TimelinePageState extends State<TimelinePage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Timeline'), ), body: ListView( children: <Widget>[ _buildEventCard('Event 1', 'Description 1', 'date 1'), _buildEventCard('Event 2', 'Description 2', 'date 2'), _buildEventCard('Event 3', 'Description 3', 'date 3'), _buildEventCard('Event 4', 'Description 4', 'date 4'), _buildEventCard('Event 5', 'Description 5', 'date 5'), _buildEventCard('Event 6', 'Description 6', 'date 6'), _buildEventCard('Event 7', 'Description 7', 'date 7'), ], ), ); } Widget _buildEventCard(String title, String description, String date) { return Card( child: ListTile( title: Text(title), subtitle: Text(description), trailing: Text(date), ), ); } } ``` 4. 运行应用程序并查看时光轴。您可以根据需要添加更多事件卡片。 这是一个基本的时光轴实现。您可以根据需要定制卡片颜色、添加图像等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值