您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

86 行
2.6 KiB

using Unity.UIWidgets.foundation;
using Unity.UIWidgets.ui;
using UnityEngine;
using Canvas = Unity.UIWidgets.ui.Canvas;
using Path = System.IO.Path;
namespace Unity.UIWidgets.widgets {
public class Lottie : StatefulWidget {
public Skottie _skottie = null;
public int _round = 0;
public float _frame = 0;
public float _duration = 0;
public Size _size = null;
public Lottie(string path, float frame = 0, Size size = null, int round = -1) {
D.assert(path != null);
_skottie = new Skottie(Path.Combine(Application.streamingAssetsPath, path));
_duration = _skottie.duration();
_round = round;
_frame = frame * _duration;
_size = size;
}
public override State createState() {
return new LottieState(_frame, _round);
}
}
public class LottieState : State<Lottie> {
float _frame = 0;
int _round = 0;
public LottieState(float frame, int round) {
_frame = frame;
_round = round;
}
public override Widget build(BuildContext context) {
if (_round != 0) {
WidgetsBinding.instance.addPostFrameCallback((_) => {
if (!mounted) {
return;
}
setState(() => {
_frame += Time.deltaTime;
if (_frame > widget._duration) {
_frame -= widget._duration;
if (_round > 0) {
_round--;
}
}
});
});
}
return new CustomPaint(
size: widget._size,
painter: new LottiePainter(
skottie: widget._skottie,
frame: _frame
)
);
}
}
public class LottiePainter : AbstractCustomPainter {
public Skottie _skottie = null;
float _frame = 0;
public LottiePainter(Skottie skottie, float frame) {
_skottie = skottie;
_frame = frame;
}
public override void paint(Canvas canvas, Size size) {
_skottie.paint(canvas, Offset.zero, size.width, size.height, _frame);
}
public override bool shouldRepaint(CustomPainter oldDelegate) {
if (oldDelegate is LottiePainter oldLottiePainter) {
return _frame != oldLottiePainter._frame;
}
return true;
}
}
}