質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

2721閲覧

【Flutter】1枚の画像を横に無限スクロールさせたい

Yasha_Wedyue

総合スコア830

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2021/10/20 01:14

編集2021/10/22 05:43

お世話になっております。
今回はFlutterに関しての質問です。

現在やりたいことについて、頭の中ではイメージできているのですが、言語化したりコードに落とし込むのが難しくて困っております。
画面サイズよりも大きな1枚の画像(端と端が繋がるような画像)があり、それを左へスライドさせていき、
画像の右端についたらその横に同じ画像をもう1枚表示し、さらにスライドさせるという
いわゆる無限ループするアニメーションを作りたいです。

言葉だけではイメージが伝わりづらいかも知れないので、稚拙ですがイメージ画像も貼っておきます。
イメージ説明
青い枠が表示する画像で、放っておくと無限ループするイメージです。
(これでも伝わらなかったらすみません)

このように、なんとなくやりたいことのイメージは出来ているのですが、Flutter上で実現する方法がさっぱり思いつきません。
似たようなことを考えている人が居ないか、いろいろ検索してみましたが有用な情報には到達できませんでした。

同じやり方でなくとも同じことが出来ればいいので、解決方法をご存知の方いらっしゃいましたら回答をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

// 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 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

投稿2021/10/28 09:29

編集2021/12/08 05:56
Yasha_Wedyue

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問