Flutter 實現虎牙

先來一張效果圖:

Flutter 實現虎牙/鬥魚 彈幕效果

實現原理

彈幕的實現原理非常簡單,即將一條彈幕從左側平移到右側,當然我們要計算彈幕垂直方向上的偏移,不然所有的彈幕都會在一條直線上,相互覆蓋。平移代碼如下:

<code>@override
void initState() {
_animationController =
AnimationController(duration: widget.duration, vsync: this)
..addStatusListener((status){
if(status == AnimationStatus.completed){
widget.onComplete('');
}
});
var begin = Offset(-1.0, .0);
var end = Offset(1.0, .0);

_animation = Tween(begin: begin, end: end).animate(_animationController);
//開始動畫
_animationController.forward();
super.initState();
}

@override
Widget build(BuildContext context) {
return SlideTransition(
position: _animation,
child: widget.child,
);
}/<code>

計算垂直方向的偏移:

<code>_computeTop(int index, double perRowHeight) {
//第幾輪彈幕
int num = (index / widget.showCount).floor();
var top;
top = (index % widget.showCount) * perRowHeight + widget.padding;

if (num % 2 == 1 && index % widget.showCount != widget.showCount - 1) {

//第二輪在第一輪2行彈幕中間
top += perRowHeight / 2;
}
if (widget.randomOffset != 0 && top > widget.randomOffset) {
top += _random.nextInt(widget.randomOffset) * 2 - widget.randomOffset;
}
return top;
}/<code>

這些準備好後,就是創建一條彈幕了,現創建一條最簡單的文字彈幕:

<code>Text(
text,
style: TextStyle(color: Colors.white),
);/<code>

效果如下:

Flutter 實現虎牙/鬥魚 彈幕效果

創建一條VIP用戶的彈幕,其實就是字體變下顏色:

<code>Text(
text,
style: TextStyle(color: Color(0xFFE9A33A)),
)/<code>

效果如下:

Flutter 實現虎牙/鬥魚 彈幕效果

給文字加個圓角背景:

<code>return Center(
child: Container(
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(

color: Colors.red.withOpacity(.8),
borderRadius: BorderRadius.circular(50)),
child: Text(
text,
style: TextStyle(color: Colors.white),
),
),
);/<code>

效果如下:

Flutter 實現虎牙/鬥魚 彈幕效果

創建一個送火箭的彈幕:

<code>return Center(
child: Container(
padding: EdgeInsets.only(left: 10, right: 10, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.red.withOpacity(.8),
borderRadius: BorderRadius.circular(50)),

child: Row(
mainAxisSize: MainAxisSize.min,
children: <widget>[
Text(
text,
style: TextStyle(color: Colors.white),
),
Image.asset('assets/images/timg.jpeg',height: 30,width: 30,),
Text(
'x $count',
style: TextStyle(color: Colors.white, fontSize: 18),
),
],
),
),
);/<widget>/<code>

效果如下:

Flutter 實現虎牙/鬥魚 彈幕效果

火箭有點醜了,不過這不是重點。

資料


分享到:


相關文章: