Flutter通過Container實現(xiàn)時間軸效果
時間軸是前端UI經(jīng)常用到的效果,先看下效果圖:
時間軸的特點
1、在列表中的高度不確定,高度取決于右側(cè) item 的高度
2、時間軸通常在第一個 item 中的樣式和其他 item 中不同。
實現(xiàn)
一、借助 Container 中 decoration 屬性,設(shè)置左側(cè)的 border,可以實現(xiàn)時間軸高度隨著 item 變化效果
Center( child: Container( width: 100, height: 100, decoration: BoxDecoration( // 設(shè)置 BoxDecoration 的 border, border 的高度就是 Container 的高度 border: Border(left: BorderSide(color: Colors.red)), color: Color(0x11000000), ), ))
效果 (圖中紅線是 Container 左側(cè)的 border,可以在這里擴展成 timeline) :
二、重寫 BorderDirectional 中 paint 方法
BorderDirectional 中原來的 paint 方法,可以看出,設(shè)置不同的屬性,會調(diào)用不同的繪制方法實現(xiàn)不同的效果,這里重新 paint 方法,實現(xiàn)時間軸的效果
paint 方法中參數(shù)
canvas : 這個就是畫布了,借助這個 canvas 可以隨意實現(xiàn)各種效果
rect : Container 的范圍大小
我們的 paint 方法實現(xiàn),按照 UI 設(shè)計圖,對應(yīng)的位置畫上圓和線就可以了
@override void paint(Canvas canvas, Rect rect, {TextDirection? textDirection, BoxShape shape = BoxShape.rectangle, BorderRadius? borderRadius}) { if (position != 1) { canvas.drawLine(Offset(rect.left+margin + radius / 2, rect.top), Offset(rect.left +margin+ radius / 2, rect.bottom), _strokePaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius, _fillPaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius,_strokePaint()); } else { canvas.drawLine(Offset(rect.left+margin + radius / 2, rect.top + radius * 2), Offset(rect.left+margin + radius / 2, rect.bottom), _strokePaint()); canvas.drawCircle(Offset(rect.left+margin + radius / 2, rect.top + radius * 2), radius, _fillPaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius, _strokePaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius / 2, _strokePaint()); } }
最終效果
三、完整代碼
class BorderTimeLine extends BorderDirectional { int position; BorderTimeLine(this.position); double radius = 10; double margin= 20; Paint _paint = Paint() ..color = Color(0xFFDDDDDD) ..strokeWidth = 1; @override void paint(Canvas canvas, Rect rect, {TextDirection? textDirection, BoxShape shape = BoxShape.rectangle, BorderRadius? borderRadius}) { if (position != 0) { canvas.drawLine(Offset(rect.left+margin + radius / 2, rect.top), Offset(rect.left +margin+ radius / 2, rect.bottom), _strokePaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius, _fillPaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius,_strokePaint()); } else { canvas.drawLine(Offset(rect.left+margin + radius / 2, rect.top + radius * 2), Offset(rect.left+margin + radius / 2, rect.bottom), _strokePaint()); canvas.drawCircle(Offset(rect.left+margin + radius / 2, rect.top + radius * 2), radius, _fillPaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius, _strokePaint()); canvas.drawCircle(Offset(rect.left +margin+ radius / 2, rect.top + radius * 2), radius / 2, _strokePaint()); } } Paint _fillPaint(){ _paint.color=Colors.white; _paint.style=PaintingStyle.fill; return _paint; } Paint _strokePaint(){ _paint.color=Color(0xFFDDDDDD); _paint.style=PaintingStyle.stroke; return _paint; } }
在 ListView 中的 item 中使用
Widget _buildItem(BuildContext c, int i) { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 20), decoration: BoxDecoration(border: BorderTimeLine(i)), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: Column(crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Padding(padding: EdgeInsets.symmetric(vertical: 10)), Divider(color: Colors.grey.shade300, thickness: 40), Text("$i" * 6, style: TextStyle(color: Colors.black, fontSize: 16)), Text("abc\n" * Random().nextInt(10)), Padding(padding: EdgeInsets.symmetric(vertical: 10)), ]), )); }
以上就是Flutter通過Container實現(xiàn)時間軸效果的詳細內(nèi)容,更多關(guān)于Flutter 實現(xiàn)時間軸效果的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android學習筆記之ListView復(fù)用機制詳解
本篇文章主要介紹了Android學習筆記之ListView復(fù)用機制詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Android高級組件AutoCompleteTextView自動完成文本框使用詳解
這篇文章主要介紹了Android高級組件AutoCompleteTextView自動完成文本框的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Kotlin協(xié)程Dispatchers原理示例詳解
這篇文章主要為大家介紹了Kotlin協(xié)程Dispatchers原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Android布局——Preference自定義layout的方法
PreferenceActivity是一個方便設(shè)置管理的界面,但是對于界面顯示來說比較單調(diào),所以自定義布局就很有必要了,下面與大家分享下Preference中自定義layout的方法2013-06-06Android實現(xiàn) Shape屬性gradient 漸變效果
這篇文章主要介紹了Android 實現(xiàn)Shape屬性gradient 漸變效果,gradient用以定義漸變色,可以定義兩色漸變和三色漸變,及漸變樣式,具體實現(xiàn)代碼感興趣的朋友跟隨小編一起看看吧2019-11-11用Android?studio實現(xiàn)簡易計算器功能
這篇文章主要為大家詳細介紹了用Android?studio實現(xiàn)簡易計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Android Mms之:聯(lián)系人管理的應(yīng)用分析
本篇文章是對Android中的聯(lián)系人管理進行了詳細的分析介紹,需要的朋友參考下2013-05-05