回答編集履歴

1

よりよい方法の追記

2021/12/08 05:56

投稿

YashaWedyue
YashaWedyue

スコア830

test CHANGED
@@ -1,3 +1,181 @@
1
+ **// 2021/12/8 追記**
2
+
3
+
4
+
5
+ 以前の内容ですと、画像の縦幅が画面のサイズを超えるとき、縦幅が画面サイズに合わせて小さくなり、
6
+
7
+ それに合わせて横幅も小さくなってループ時にずれることがありました。
8
+
9
+ ずれない方法を考えましたので、追記しておきます。
10
+
11
+
12
+
13
+ ```lang-dart
14
+
15
+ // デバイスの画面サイズ(高さ)
16
+
17
+ late double deviceHeight;
18
+
19
+
20
+
21
+ // 画像の横幅
22
+
23
+ late double imageWidth;
24
+
25
+
26
+
27
+ // アニメーションコントローラー
28
+
29
+ late AnimationController controller;
30
+
31
+
32
+
33
+ // アニメーション
34
+
35
+ late Animation<RelativeRect> rectAnimation;
36
+
37
+
38
+
39
+ // contextを受け取るために、didChangeDependenciesで初期化する
40
+
41
+ @override
42
+
43
+ void didChangeDependencies() {
44
+
45
+ super.didChangeDependencies();
46
+
47
+
48
+
49
+ // デバイスの画面サイズ(高さ)取得
50
+
51
+ deviceHeight = MediaQuery.of(context).size.height;
52
+
53
+
54
+
55
+ // 画像の縦横比
56
+
57
+ double aspectRatio = 1.8;
58
+
59
+
60
+
61
+ // 画像の横幅計算
62
+
63
+ imageWidth = deviceHeight * aspectRatio;
64
+
65
+
66
+
67
+ // コントローラー初期化
68
+
69
+ controller = AnimationController(
70
+
71
+ vsync: this,
72
+
73
+ duration: const Duration(seconds: 10),
74
+
75
+ )..repeat();
76
+
77
+
78
+
79
+ // 1枚目が終わったら止めてリピートする
80
+
81
+ rectAnimation = RelativeRectTween(
82
+
83
+ begin: RelativeRect.fromLTRB(imageWidth, 0, 0, 0),
84
+
85
+ end: RelativeRect.fromLTRB(0, 0, imageWidth, 0),
86
+
87
+ ).animate(
88
+
89
+ CurvedAnimation(parent: controller, curve: Curves.linear),
90
+
91
+ );
92
+
93
+ }
94
+
95
+
96
+
97
+ @override
98
+
99
+ void dispose() {
100
+
101
+ controller.dispose();
102
+
103
+ super.dispose();
104
+
105
+ }
106
+
107
+
108
+
109
+ @override
110
+
111
+ Widget build(BuildContext context) {
112
+
113
+ return Scaffold(
114
+
115
+ body: PositionedTransition(
116
+
117
+ rect: rectAnimation,
118
+
119
+ child: OverflowBox(
120
+
121
+ maxWidth: imageWidth * 2, // 画像2枚分
122
+
123
+ maxHeight: deviceHeight, // 画面の高さに合わせる
124
+
125
+ child: Row(
126
+
127
+ children: <Widget>[
128
+
129
+ Image(
130
+
131
+ height: deviceHeight, // 画面の高さに合わせる
132
+
133
+ fit: BoxFit.fitHeight,
134
+
135
+ image: const AssetImage('画像のパス'),
136
+
137
+ ),
138
+
139
+ Image(
140
+
141
+ height: deviceHeight, // 画面の高さに合わせる
142
+
143
+ fit: BoxFit.fitHeight,
144
+
145
+ image: const AssetImage('画像のパス'),
146
+
147
+ ),
148
+
149
+ ],
150
+
151
+ ),
152
+
153
+ ),
154
+
155
+ ),
156
+
157
+ );
158
+
159
+ }
160
+
161
+ ```
162
+
163
+
164
+
165
+ この方法は、画像が画面全体を覆うようなものである場合に有用です。
166
+
167
+ 縦幅が絶対に画面サイズを超えない場合は、以前の方法で問題ないかと思います。
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+ **// 以前の自己解決時の内容**
176
+
177
+
178
+
1
179
  `PositionedTransition`を使ってなんとかそれっぽくなったので自己解決とします。
2
180
 
3
181