// 2021/12/8 追記
以前の内容ですと、画像の縦幅が画面のサイズを超えるとき、縦幅が画面サイズに合わせて小さくなり、
それに合わせて横幅も小さくなってループ時にずれることがありました。
ずれない方法を考えましたので、追記しておきます。
lang
1// デバイスの画面サイズ(高さ)
2late double deviceHeight;
3
4// 画像の横幅
5late double imageWidth;
6
7// アニメーションコントローラー
8late AnimationController controller;
9
10// アニメーション
11late Animation<RelativeRect> rectAnimation;
12
13// contextを受け取るために、didChangeDependenciesで初期化する
14@override
15void didChangeDependencies() {
16 super.didChangeDependencies();
17
18 // デバイスの画面サイズ(高さ)取得
19 deviceHeight = MediaQuery.of(context).size.height;
20
21 // 画像の縦横比
22 double aspectRatio = 1.8;
23
24 // 画像の横幅計算
25 imageWidth = deviceHeight * aspectRatio;
26
27 // コントローラー初期化
28 controller = AnimationController(
29 vsync: this,
30 duration: const Duration(seconds: 10),
31 )..repeat();
32
33 // 1枚目が終わったら止めてリピートする
34 rectAnimation = RelativeRectTween(
35 begin: RelativeRect.fromLTRB(imageWidth, 0, 0, 0),
36 end: RelativeRect.fromLTRB(0, 0, imageWidth, 0),
37 ).animate(
38 CurvedAnimation(parent: controller, curve: Curves.linear),
39 );
40}
41
42@override
43void dispose() {
44 controller.dispose();
45 super.dispose();
46}
47
48@override
49Widget build(BuildContext context) {
50 return Scaffold(
51 body: PositionedTransition(
52 rect: rectAnimation,
53 child: OverflowBox(
54 maxWidth: imageWidth * 2, // 画像2枚分
55 maxHeight: deviceHeight, // 画面の高さに合わせる
56 child: Row(
57 children: <Widget>[
58 Image(
59 height: deviceHeight, // 画面の高さに合わせる
60 fit: BoxFit.fitHeight,
61 image: const AssetImage('画像のパス'),
62 ),
63 Image(
64 height: deviceHeight, // 画面の高さに合わせる
65 fit: BoxFit.fitHeight,
66 image: const AssetImage('画像のパス'),
67 ),
68 ],
69 ),
70 ),
71 ),
72 );
73}
この方法は、画像が画面全体を覆うようなものである場合に有用です。
縦幅が絶対に画面サイズを超えない場合は、以前の方法で問題ないかと思います。
// 以前の自己解決時の内容
PositionedTransition
を使ってなんとかそれっぽくなったので自己解決とします。
dart
1late final AnimationController _controller = AnimationController(
2 vsync: this,
3 duration: const Duration(seconds: 10),
4)..repeat();
5
6@override
7Widget build(BuildContext context) {
8 return PositionedTransition(
9 rect: RelativeRectTween(
10 begin: const RelativeRect.fromLTRB(1200, 0, 0, 0),
11 end: const RelativeRect.fromLTRB(0, 0, 1200, 0),
12 ).animate(
13 CurvedAnimation(parent: _controller, curve: Curves.linear),
14 ),
15 child: OverflowBox(
16 maxWidth: 2400,
17 ),
18 child: Row(
19 children: <Widget>[
20 // 画像を2枚並べる
21 ],
22 ),
23 );
24}
25
26
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。