Flutter 진급 의 애니메이션 효과 구현(4)
먼저 bar.dart 에 BarChart 클래스 를 만 들 고 고정된 길이 의 Bar 인 스 턴 스 목록 을 사용 합 니 다.우 리 는 일주일 에 5 일의 근무일 을 표시 하기 위해 5 개의 줄 을 사용 할 것 이다.그리고 공백 과 무 작위 인 스 턴 스 를 만 드 는 책임 을 Bar 에서 BarChart 로 옮 겨 야 합 니 다.
import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'dart:ui' show lerpDouble;
import 'dart:math';
import 'color_palette.dart';
class BarChart {
static const int barCount = 5;
final List<Bar> bars;
BarChart(this.bars) {
assert(bars.length == barCount);
}
factory BarChart.empty() {
return new BarChart(
/*
List.filled(
int length,
E fill, {
bool growable: false
}
)
, fill
length
*/
new List.filled(
barCount,
new Bar(0.0, Colors.transparent)
)
);
}
factory BarChart.random(Random random) {
final Color color = ColorPalette.primary.random(random);
return new BarChart(
/*
List.generate(
int length,
E generator(
int index
), {
bool growable: true
}
)
, generator
, growable true
*/
new List.generate(
barCount,
(i) => new Bar(
random.nextDouble()*100.0,
color
)
)
);
}
static BarChart lerp(BarChart begin, BarChart end, double t) {
return new BarChart(
new List.generate(
barCount,
(i) => Bar.lerp(begin.bars[i], end.bars[i], t)
)
);
}
}
class BarChartTween extends Tween<BarChart> {
BarChartTween(BarChart begin, BarChart end) : super(begin: begin, end: end);
@override
BarChart lerp(double t) => BarChart.lerp(begin, end, t);
}
class Bar {
Bar(this.height, this.color);
final double height;
final Color color;
static Bar lerp(Bar begin, Bar end, double t) {
return new Bar(
lerpDouble(begin.height, end.height, t),
Color.lerp(begin.color, end.color, t)
);
}
}
class BarTween extends Tween<Bar> {
BarTween(Bar begin, Bar end) : super(begin: begin, end: end);
@override
Bar lerp(double t) => Bar.lerp(begin, end, t);
}
class BarChartPainter extends CustomPainter {
static const barWidthFraction = 0.75;
BarChartPainter(Animation<BarChart> animation)
: animation = animation,
super(repaint: animation);
final Animation<BarChart> animation;
@override
void paint(Canvas canvas, Size size) {
void drawBar(Bar bar, double x, double width, Paint paint) {
paint.color = bar.color;
canvas.drawRect(
new Rect.fromLTWH(
x,
size.height-bar.height,
width,
bar.height
),
paint
);
}
/*
Paint:Canvas
style: 、 , PaintingStyle.fill
*/
final paint = new Paint()..style = PaintingStyle.fill;
final chart = animation.value;
//
final barDistance = size.width/(1+chart.bars.length);
// 75%
final barWidth = barDistance*barWidthFraction;
// x
var x = barDistance-barWidth/2;
for (final bar in chart.bars) {
drawBar(bar, x, barWidth, paint);
x += barDistance;
}
}
@override
bool shouldRepaint(BarChartPainter old) => false;
}
BarChartPainter 는 선형 사이 에 사용 가능 한 폭 을 골 고루 분배 하고 각 선형 이 사용 가능 한 너비 의 75%를 차지한다.다음은 main.dart 를 업데이트 하고 BarChart,BarChart Tween 으로 Bar,BarTween 을 교체 합 니 다.
// ...
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
final random = new Random();
AnimationController animation;
BarChartTween tween;
@override
void initState() {
super.initState();
animation = new AnimationController(
duration: const Duration(milliseconds: 300),
vsync: this
);
tween = new BarChartTween(new BarChart.empty(), new BarChart.random(random));
animation.forward();
}
@override
void dispose() {
animation.dispose();
super.dispose();
}
void changeData() {
setState(() {
tween = new BarChartTween(
tween.evaluate(animation),
new BarChart.random(random),
);
animation.forward(from: 0.0);
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new CustomPaint(
size: new Size(200.0, 100.0),
painter: new BarChartPainter(tween.animate(animation))
)
),
floatingActionButton: new FloatingActionButton(
onPressed: changeData,
child: new Icon(Icons.refresh),
),
);
}
}
현재 프로그램의 효 과 는 다음 그림 과 같 습 니 다:이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Flutter】DateTime 전월의 일수를 취득한다달의 일수를 취득할 필요가 있어, 의외로 수요 있을까라고 생각했으므로 비망록 정도에 남겨 둡니다. DateTime 날짜에 0을 입력하면 전월 DateTime이 됩니다. 2021년 3월 0일 = 2021년 2월 28일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.