基于Animation实现视频弹幕动效

封装弹幕动效

barrage_transition.dart

/// 弹幕移动动效
class BarrageTransition extends StatefulWidget {
  final Widget child;

  // 动画播放时长
  final Duration duration;

  // 动画播放结束回调
  final ValueChanged onComplete;

  const BarrageTransition({Key key, this.child, this.duration, this.onComplete})
      : super(key: key);

  @override
  BarrageTransitionState createState() => BarrageTransitionState();
}

class BarrageTransitionState extends State<BarrageTransition>
    with SingleTickerProviderStateMixin {
  
  // 动画播放控制
  AnimationController _animationController;
  // 动画
  Animation<Offset> _animation;

  @override
  void initState() {
    super.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
    _animation = Tween(begin: begin, end: end).animate(_animationController);
    // 执行动画
    _animationController.forward();
  }

  /// 进行资源的释放
  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }

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

实现弹幕播放

barrage_item.dart

/// 弹幕Widget
class BarrageItem extends StatelessWidget {
  final String id;
  final double top;
  final Widget child;
  final ValueChanged onComplete;
  final Duration duration;

  BarrageItem(
      {Key key,
      this.id,
      this.top,
      this.child,
      this.onComplete,
      this.duration = const Duration(milliseconds: 9000)})
      : super(key: key);

  // fix 动画状态错乱
  var _key = GlobalKey<BarrageTransitionState>();

  @override
  Widget build(BuildContext context) {
    return Positioned.fill(
      top: top,
      child: BarrageTransition(
        key: _key,
        child: child,
        onComplete: (v) {
          // 播放结束
          onComplete(id);
        },
        // 播放时长
        duration: duration,
      ),
    );
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值