<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Animation</title>
	<atom:link href="https://techgrowup.net/tag/animation/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Tue, 22 Oct 2024 05:20:49 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>Animation</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門57 FlutterでFade-Inエフェクトを簡単に作成</title>
		<link>https://techgrowup.net/flutter-opacity-animation/</link>
					<comments>https://techgrowup.net/flutter-opacity-animation/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Tue, 22 Oct 2024 05:20:47 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Opacity]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1991</guid>

					<description><![CDATA[はじめに アプリケーションに視覚的な魅力を加えるために、アニメーションは非常に重要な要素です。特に、要素を徐々に表示させたり非表示にしたりするOpacityアニメーション（フェードイン・フェードアウト）は、Flutter [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">アプリケーションに視覚的な魅力を加えるために、アニメーションは非常に重要な要素です。特に、要素を徐々に表示させたり非表示にしたりする<strong>Opacityアニメーション</strong>（フェードイン・フェードアウト）は、FlutterアプリのUIを洗練させるために非常に効果的です。Flutterでは、<strong>Opacityアニメーション</strong>を簡単に実装するための機能が用意されています。</p>



<p class="wp-block-paragraph">この記事では、<strong>FlutterでOpacityアニメーション（フェードアニメーション）を実装する方法</strong>を詳しく解説します。これにより、スムーズなフェードイン・フェードアウト効果を簡単にアプリに取り入れることができ、ユーザー体験を向上させることができます。</p>



<h2 class="wp-block-heading">Opacityアニメーションとは</h2>



<p class="wp-block-paragraph"><strong>Opacityアニメーション</strong>は、ウィジェットの透明度（不透明度）を時間の経過に合わせて徐々に変化させるアニメーションです。<strong>フェードイン</strong>や<strong>フェードアウト</strong>と呼ばれることもあり、ウィジェットをスムーズに表示または非表示にする際に用いられます。</p>



<p class="wp-block-paragraph">Flutterでは、<code>Opacity</code>ウィジェットや<code>AnimatedOpacity</code>ウィジェットを使うことで、透明度をアニメーションでコントロールすることができます。</p>



<h2 class="wp-block-heading">Opacityアニメーションの基本的な使い方</h2>



<h3 class="wp-block-heading">AnimatedOpacityを使ったフェードイン・フェードアウト</h3>



<p class="wp-block-paragraph">Flutterでは、<code>AnimatedOpacity</code>を使って簡単にOpacityアニメーションを実装できます。これにより、ウィジェットの透明度を自動的にアニメーションで変化させることが可能です。</p>



<h6 class="wp-block-heading">サンプルコード：AnimatedOpacityによるフェードアニメーション</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/material.dart';

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OpacityAnimationExample(),
    );
  }
}

class OpacityAnimationExample extends StatefulWidget {
  @override
  _OpacityAnimationExampleState createState() =&gt; _OpacityAnimationExampleState();
}

class _OpacityAnimationExampleState extends State&lt;OpacityAnimationExample&gt; {
  double _opacity = 1.0;

  void _toggleOpacity() {
    setState(() {
      _opacity = _opacity == 1.0 ? 0.0 : 1.0;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Opacity Animation Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            AnimatedOpacity(
              opacity: _opacity,
              duration: Duration(seconds: 2),
              child: Container(
                width: 200,
                height: 200,
                color: Colors.blue,
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toggleOpacity,
              child: Text('Fade In/Out'),
            ),
          ],
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #4EC9B0">OpacityAnimationExample</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OpacityAnimationExample</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatefulWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">_OpacityAnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createState</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #4EC9B0">_OpacityAnimationExampleState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_OpacityAnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">OpacityAnimationExample</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">double</span><span style="color: #D4D4D4"> _opacity = </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">_toggleOpacity</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">setState</span><span style="color: #D4D4D4">(() {</span></span>
<span class="line"><span style="color: #D4D4D4">      _opacity = _opacity == </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4"> ? </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4"> : </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Opacity Animation Example&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">Column</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          mainAxisAlignment: </span><span style="color: #4EC9B0">MainAxisAlignment</span><span style="color: #D4D4D4">.center,</span></span>
<span class="line"><span style="color: #D4D4D4">          children: &lt;</span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4">&gt;[</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">AnimatedOpacity</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              opacity: _opacity,</span></span>
<span class="line"><span style="color: #D4D4D4">              duration: </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">              child: </span><span style="color: #4EC9B0">Container</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">                width: </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                height: </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                color: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.blue,</span></span>
<span class="line"><span style="color: #D4D4D4">              ),</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">SizedBox</span><span style="color: #D4D4D4">(height: </span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">ElevatedButton</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              onPressed: _toggleOpacity,</span></span>
<span class="line"><span style="color: #D4D4D4">              child: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Fade In/Out&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">          ],</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>AnimatedOpacity</strong>：ウィジェットの透明度（不透明度）をアニメーションさせるために使用します。<code>opacity</code>プロパティに0.0から1.0までの値を指定し、どれくらい透明にするかを決定します。</li>



<li><strong>duration</strong>：アニメーションの長さを指定します。例では2秒間でフェードイン・フェードアウトを行います。</li>



<li><strong>setState</strong>：ボタンをタップした際に透明度の状態を変更し、アニメーションをトリガーします。</li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="flutter opacity animation button" width="1256" height="707" src="https://www.youtube.com/embed/8Ai8c9uCgLI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Opacityアニメーションの応用</h2>



<h3 class="wp-block-heading">状態に基づくアニメーション</h3>



<p class="wp-block-paragraph">アニメーションは、ユーザー操作や状態に応じて動的に変化させることが可能です。たとえば、ユーザーがボタンをタップしたときにフェードイン、もしくは自動的に一定時間後にフェードアウトするアニメーションを簡単に追加できます。</p>



<h6 class="wp-block-heading">自動フェードアウトの例</h6>



<p class="wp-block-paragraph">以下のコードでは、アプリの起動時に一定時間後に自動的にフェードアウトするアニメーションを実装しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class AutoFadeOut extends StatefulWidget {
  @override
  _AutoFadeOutState createState() =&gt; _AutoFadeOutState();
}

class _AutoFadeOutState extends State&lt;AutoFadeOut&gt; {
  double _opacity = 1.0;

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 3), () {
      setState(() {
        _opacity = 0.0;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Auto Fade Out Example')),
      body: Center(
        child: AnimatedOpacity(
          opacity: _opacity,
          duration: Duration(seconds: 2),
          child: Container(
            width: 200,
            height: 200,
            color: Colors.red,
          ),
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AutoFadeOut</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatefulWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">_AutoFadeOutState</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createState</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #4EC9B0">_AutoFadeOutState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_AutoFadeOutState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">AutoFadeOut</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">double</span><span style="color: #D4D4D4"> _opacity = </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Future</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">delayed</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">), () {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">setState</span><span style="color: #D4D4D4">(() {</span></span>
<span class="line"><span style="color: #D4D4D4">        _opacity = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      });</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Auto Fade Out Example&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">AnimatedOpacity</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          opacity: _opacity,</span></span>
<span class="line"><span style="color: #D4D4D4">          duration: </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">          child: </span><span style="color: #4EC9B0">Container</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            width: </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            height: </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            color: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.red,</span></span>
<span class="line"><span style="color: #D4D4D4">          ),</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="flutter opacity animation auto" width="1256" height="707" src="https://www.youtube.com/embed/A343Fw-AkDE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 class="wp-block-heading">リストアイテムのフェードイン</h3>



<p class="wp-block-paragraph">リストアイテムをスクロールして表示した際に、アイテムがフェードインするアニメーションを作成することも可能です。これにより、ユーザーの目を引く動きを加えることができます。</p>



<h6 class="wp-block-heading">リストのアイテムフェードイン例</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class FadeInListItem extends StatelessWidget {
  final String text;
  final Animation&lt;double&gt; animation;

  FadeInListItem({required this.text, required this.animation});

  @override
  Widget build(BuildContext context) {
    return FadeTransition(
      opacity: animation,
      child: ListTile(
        title: Text(text),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FadeInListItem</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> text;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Animation</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">double</span><span style="color: #D4D4D4">&gt; animation;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">FadeInListItem</span><span style="color: #D4D4D4">({</span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.text, </span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.animation});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FadeTransition</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      opacity: animation,</span></span>
<span class="line"><span style="color: #D4D4D4">      child: </span><span style="color: #4EC9B0">ListTile</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(text),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">この例では、<code>FadeTransition</code>ウィジェットを使用して、リストアイテムがフェードインするアニメーションを簡単に追加できます。</p>



<h2 class="wp-block-heading">Opacityアニメーションのメリット</h2>



<ol class="wp-block-list">
<li>アプリの視覚的な魅力を向上
<ul class="wp-block-list">
<li><strong>Opacityアニメーション</strong>を使うことで、ユーザーの視覚的な体験を大幅に向上させることができます。要素が徐々に表示・非表示になる動きは、視覚的に心地よく、アプリ全体のデザインを洗練されたものにします。</li>
</ul>
</li>



<li>ユーザーの関心を引く
<ul class="wp-block-list">
<li>フェードイン・フェードアウトは、特定の要素にユーザーの注意を引きたい場合に効果的です。たとえば、重要なメッセージや通知をフェードインさせることで、ユーザーに自然に目を向けさせることができます。</li>
</ul>
</li>



<li>実装が簡単
<ul class="wp-block-list">
<li><code>AnimatedOpacity</code>を使えば、コードの手間をかけずにアニメーションを実装できます。UIの一部をスムーズにアニメーションさせたい場合、非常に簡単かつ効果的です。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Flutterでの<strong>Opacityアニメーション</strong>を使えば、アプリに滑らかで自然な視覚効果を追加でき、UI全体が洗練されます。フェードイン・フェードアウトは視覚的に非常に効果的で、アプリの使い心地を向上させるためのシンプルかつ強力な手法です。特に、ユーザーの操作に応じてダイナミックに変化するエフェクトは、アプリにインタラクティブな要素を加える際に最適です。</p>



<p class="wp-block-paragraph">ぜひ今回のチュートリアルを参考にして、<strong>FlutterアプリにOpacityアニメーション</strong>を取り入れ、より魅力的なUIを作成してみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-opacity-animation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flutter開発入門56 FlutterのHeroアニメーションで魅力的な画面遷移を実現する方法</title>
		<link>https://techgrowup.net/flutter-hero-animation/</link>
					<comments>https://techgrowup.net/flutter-hero-animation/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 21 Oct 2024 13:13:42 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Hero]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1988</guid>

					<description><![CDATA[はじめに Flutterには、画面間で要素をスムーズに遷移させるための強力なツールがいくつか用意されていますが、その中でも特に注目すべきなのがHeroアニメーションです。Heroアニメーションは、画面をまたいでウィジェッ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">Flutterには、画面間で要素をスムーズに遷移させるための強力なツールがいくつか用意されていますが、その中でも特に注目すべきなのが<strong>Heroアニメーション</strong>です。<strong>Heroアニメーション</strong>は、<strong>画面をまたいでウィジェットが動的に変化するエフェクト</strong>を作り、よりインタラクティブで魅力的なUI体験を提供します。ユーザーが次の画面に移動するとき、視覚的に関連する要素がスムーズにアニメーションしながら移動することで、アプリ全体に一貫性のあるデザインを感じさせることができます。</p>



<p class="wp-block-paragraph">この記事では、Flutterで<strong>Heroアニメーションの基本的な使い方</strong>と、その実装方法を紹介します。Heroアニメーションを使いこなすことで、アプリの見た目と操作感を大きく向上させることができます。</p>



<h2 class="wp-block-heading">Heroアニメーションとは</h2>



<p class="wp-block-paragraph"><strong>Heroアニメーション</strong>とは、Flutterのウィジェット間で滑らかに要素を移動させるアニメーションです。例えば、サムネイル画像をタップして詳細画面に遷移する際、その画像がアニメーションを伴って画面を移動することで、自然なつながりを感じさせます。</p>



<p class="wp-block-paragraph">Heroアニメーションは、Flutterの<code>Hero</code>ウィジェットを使って簡単に実装できます。<code>Hero</code>ウィジェットを画面をまたぐ共通の要素として指定することで、アニメーションが自動的に行われます。</p>



<h3 class="wp-block-heading">主な特徴</h3>



<ul class="wp-block-list">
<li><strong>滑らかな画面遷移</strong>：ユーザーが意識することなく、画面間でのスムーズな遷移が可能。</li>



<li><strong>簡単な実装</strong>：<code>Hero</code>ウィジェットを使用するだけで、複雑なアニメーションを簡単に実現できます。</li>



<li><strong>視覚的な一貫性</strong>：関連するウィジェットがアニメーションでつながることで、画面間の関連性を強調。</li>
</ul>



<h2 class="wp-block-heading">Heroアニメーションの基本的な使い方</h2>



<h3 class="wp-block-heading">Heroアニメーションのセットアップ</h3>



<p class="wp-block-paragraph">まず、<code>Hero</code>ウィジェットを使って、シンプルなHeroアニメーションを作成します。以下の例では、画像がホーム画面から詳細画面へアニメーションを伴って移動します。</p>



<h6 class="wp-block-heading">サンプルコード：Heroアニメーションの基本</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/material.dart';

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home')),
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) =&gt; DetailScreen()),
            );
          },
          child: Hero(
            tag: 'imageHero',
            child: Image.network(
              'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg',
              width: 100,
            ),
          ),
        ),
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Detail')),
      body: Center(
        child: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Hero(
            tag: 'imageHero',
            child: Image.network(
              'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg',
            ),
          ),
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #4EC9B0">HomeScreen</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HomeScreen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Home&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">GestureDetector</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          onTap: () {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">Navigator</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              context,</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #4EC9B0">MaterialPageRoute</span><span style="color: #D4D4D4">(builder: (context) =&gt; </span><span style="color: #4EC9B0">DetailScreen</span><span style="color: #D4D4D4">()),</span></span>
<span class="line"><span style="color: #D4D4D4">            );</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          child: </span><span style="color: #4EC9B0">Hero</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            tag: </span><span style="color: #CE9178">&#39;imageHero&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            child: </span><span style="color: #4EC9B0">Image</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">network</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #CE9178">&#39;https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">              width: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">          ),</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DetailScreen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Detail&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">GestureDetector</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          onTap: () {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">Navigator</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">pop</span><span style="color: #D4D4D4">(context);</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          child: </span><span style="color: #4EC9B0">Hero</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            tag: </span><span style="color: #CE9178">&#39;imageHero&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            child: </span><span style="color: #4EC9B0">Image</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">network</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #CE9178">&#39;https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">          ),</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>Heroウィジェット</strong>：<code>Hero</code>ウィジェットは、2つの画面で同じ<code>tag</code>を持つウィジェットをリンクします。ここでは、<code>tag: 'imageHero'</code>を使い、ホーム画面と詳細画面で同じ画像がアニメーションで遷移します。</li>



<li><strong>GestureDetector</strong>：タップイベントを検出するために<code>GestureDetector</code>を使用し、ユーザーが画像をタップしたときに画面遷移を行います。</li>



<li><strong>Navigator.push()</strong>：画面遷移の際に、Heroアニメーションが適用されます。<code>Navigator.pop()</code>で元の画面に戻った際にも、アニメーションが適用されます。</li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="flutter hero animation demo" width="1256" height="707" src="https://www.youtube.com/embed/SsIQWdhHybM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Heroアニメーションの詳細設定</h2>



<h3 class="wp-block-heading">カスタムアニメーション</h3>



<p class="wp-block-paragraph">デフォルトでは、Heroアニメーションは<strong>スムーズに拡大・縮小</strong>されますが、カスタムアニメーションを適用することも可能です。たとえば、アニメーションの曲線（カーブ）や速度をカスタマイズできます。</p>



<h6 class="wp-block-heading">カスタムアニメーションの実装例</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Hero(
  tag: 'imageHero',
  flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) {
    return ScaleTransition(
      scale: animation.drive(
        Tween(begin: 0.5, end: 1.0).chain(CurveTween(curve: Curves.easeInOut)),
      ),
      child: toHeroContext.widget,
    );
  },
  child: Image.network(
    'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg',
    width: 100,
  ),
)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Hero</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">  tag: </span><span style="color: #CE9178">&#39;imageHero&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  flightShuttleBuilder: (flightContext, animation, flightDirection, fromHeroContext, toHeroContext) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ScaleTransition</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      scale: animation.</span><span style="color: #DCDCAA">drive</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Tween</span><span style="color: #D4D4D4">(begin: </span><span style="color: #B5CEA8">0.5</span><span style="color: #D4D4D4">, end: </span><span style="color: #B5CEA8">1.0</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">chain</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">CurveTween</span><span style="color: #D4D4D4">(curve: </span><span style="color: #4EC9B0">Curves</span><span style="color: #D4D4D4">.easeInOut)),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      child: toHeroContext.widget,</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  child: </span><span style="color: #4EC9B0">Image</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">network</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    width: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  ),</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>flightShuttleBuilder</strong>：<code>Hero</code>ウィジェットのアニメーションをカスタマイズするために使用します。アニメーションの進行中に、どのようにウィジェットを描画するかを定義できます。</li>



<li><strong>ScaleTransition</strong>：カスタムのスケールアニメーションを適用し、<code>Tween</code>と<code>CurveTween</code>を組み合わせて、<code>easeInOut</code>のカーブで拡大・縮小を実現しています。</li>
</ul>



<h2 class="wp-block-heading">Heroアニメーションのメリット</h2>



<ol class="wp-block-list">
<li>視覚的な関連性を強調
<ul class="wp-block-list">
<li><strong>Heroアニメーション</strong>を使うことで、画面遷移時に重要な要素がスムーズに移動し、視覚的な関連性が強調されます。ユーザーが遷移元と遷移先のつながりを認識しやすくなるため、より自然なUXを提供できます。</li>
</ul>
</li>



<li>簡単に魅力的なアニメーションを実装
<ul class="wp-block-list">
<li><code>Hero</code>ウィジェットを使うだけで、複雑なアニメーションを簡単に実装できます。コードの手間が少ないため、短時間で視覚的にリッチなUIを構築できます。</li>
</ul>
</li>



<li>ユーザー体験の向上
<ul class="wp-block-list">
<li>画面間でのスムーズな遷移は、アプリ全体に統一感を持たせ、ユーザー体験を向上させます。特に、モバイルアプリでは、インタラクティブでリッチな体験を提供することが重要です。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">Heroアニメーションの活用シーン</h2>



<p class="wp-block-paragraph"><strong>Heroアニメーション</strong>は、さまざまなシーンで活用できます。特に以下のような場合に有効です。</p>



<ul class="wp-block-list">
<li><strong>画像ギャラリーの画面遷移</strong>：サムネイル画像から詳細画面に遷移する際に、Heroアニメーションでスムーズに表示。</li>



<li><strong>リストから詳細画面への遷移</strong>：リストアイテムをタップした際、詳細画面に同じアイテムを大きく表示するアニメーション。</li>



<li><strong>ダッシュボードから詳細情報への移行</strong>：主要なデータや情報をダッシュボードから詳細画面にスムーズに遷移させ、視覚的に強調。</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Flutterの<strong>Heroアニメーション</strong>を使うことで、アプリの画面遷移を滑らかにし、よりインタラクティブなユーザー体験を提供できます。少ないコードで魅力的なアニメーションを実装でき、視覚的な一貫性を持たせることができるため、アプリ全体のデザインやUXを向上させる手段として非常に有効です。</p>



<p class="wp-block-paragraph">Flutter開発の際には、ぜひ<strong>Heroアニメーション</strong>を活用して、ユーザーにとって視覚的にも楽しめるアプリを作りましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-hero-animation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flutter開発入門55 CurvedAnimationで滑らかなアニメーションを実現する</title>
		<link>https://techgrowup.net/flutter-curved-animation/</link>
					<comments>https://techgrowup.net/flutter-curved-animation/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sun, 20 Oct 2024 07:11:24 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Curved]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1985</guid>

					<description><![CDATA[はじめに Flutterでアニメーションを作成する際、直線的な動きだけではなく、動きに自然な加速・減速を取り入れたい場合があります。そんなときに使えるのが、CurvedAnimationです。CurvedAnimatio [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">Flutterでアニメーションを作成する際、直線的な動きだけではなく、動きに<strong>自然な加速・減速</strong>を取り入れたい場合があります。そんなときに使えるのが、<strong>CurvedAnimation</strong>です。<strong>CurvedAnimation</strong>を使うと、アニメーションの速度や進行に曲線的な変化（イージング）を追加し、より自然で滑らかなアニメーションを実現できます。</p>



<p class="wp-block-paragraph">この記事では、<strong>CurvedAnimationの基本的な概念と使い方</strong>について、詳しく解説します。これを学ぶことで、Flutterアプリのアニメーションにリアリスティックな動きを加えることができ、アプリのユーザー体験が向上するでしょう。</p>



<h2 class="wp-block-heading">CurvedAnimationとは</h2>



<p class="wp-block-paragraph"><strong>CurvedAnimation</strong>は、Flutterでアニメーションを作成するときに、進行具合をカーブ（曲線）でコントロールするためのクラスです。アニメーションの動きに<strong>イージング</strong>（加速や減速）を加えることで、より自然な動きを表現できます。**直線的な変化（線形）**ではなく、アニメーションの進行具合を曲線的に変えることで、さまざまな動きを実現できます。</p>



<h3 class="wp-block-heading">CurvedAnimationの主な特徴</h3>



<ul class="wp-block-list">
<li><strong>イージング効果</strong>：アニメーションの加速・減速を簡単に設定できます。</li>



<li><strong>多様なカーブの選択肢</strong>：Flutterには、さまざまなプリセットカーブ（<code>Curves</code>）が用意されています。例: <code>Curves.easeIn</code>, <code>Curves.bounceOut</code>など。</li>



<li><strong>簡単な実装</strong>：<code>AnimationController</code>にカーブを追加するだけで、複雑な動きが表現可能です。</li>
</ul>



<h2 class="wp-block-heading">CurvedAnimationの基本的な使い方</h2>



<h3 class="wp-block-heading">CurvedAnimationを使ったアニメーション</h3>



<p class="wp-block-paragraph">まず、<code>CurvedAnimation</code>を使って、シンプルなアニメーションを作成してみましょう。<strong>AnimationController</strong>にカーブを追加し、アニメーションの進行に加速や減速を加えます。</p>



<h6 class="wp-block-heading">サンプルコード：CurvedAnimationの基本</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/material.dart';

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AnimationExample(),
    );
  }
}

class AnimationExample extends StatefulWidget {
  @override
  _AnimationExampleState createState() =&gt; _AnimationExampleState();
}

class _AnimationExampleState extends State&lt;AnimationExample&gt; with TickerProviderStateMixin {
  late AnimationController _controller;
  late CurvedAnimation _curvedAnimation;

  @override
  void initState() {
    super.initState();
    // AnimationControllerを初期化
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    );

    // CurvedAnimationを設定し、イージングカーブを追加
    _curvedAnimation = CurvedAnimation(
      parent: _controller,
      curve: Curves.easeInOut,  // カーブの種類
    );

    // アニメーションをリピート再生
    _controller.repeat(reverse: true);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('CurvedAnimation Example')),
      body: Center(
        child: AnimatedBuilder(
          animation: _curvedAnimation,
          builder: (context, child) {
            return Transform.scale(
              scale: _curvedAnimation.value + 1,  // カーブに基づいてスケールを変更
              child: child,
            );
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatefulWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createState</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4">&gt; </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TickerProviderStateMixin</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4"> _controller;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CurvedAnimation</span><span style="color: #D4D4D4"> _curvedAnimation;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// AnimationControllerを初期化</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller = </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      duration: </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      vsync: </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// CurvedAnimationを設定し、イージングカーブを追加</span></span>
<span class="line"><span style="color: #D4D4D4">    _curvedAnimation = </span><span style="color: #4EC9B0">CurvedAnimation</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      parent: _controller,</span></span>
<span class="line"><span style="color: #D4D4D4">      curve: </span><span style="color: #4EC9B0">Curves</span><span style="color: #D4D4D4">.easeInOut,  </span><span style="color: #6A9955">// カーブの種類</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// アニメーションをリピート再生</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller.</span><span style="color: #DCDCAA">repeat</span><span style="color: #D4D4D4">(reverse: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;CurvedAnimation Example&#39;</span><span style="color: #D4D4D4">)),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">AnimatedBuilder</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          animation: _curvedAnimation,</span></span>
<span class="line"><span style="color: #D4D4D4">          builder: (context, child) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Transform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">scale</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              scale: _curvedAnimation.value + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,  </span><span style="color: #6A9955">// カーブに基づいてスケールを変更</span></span>
<span class="line"><span style="color: #D4D4D4">              child: child,</span></span>
<span class="line"><span style="color: #D4D4D4">            );</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          child: </span><span style="color: #4EC9B0">Container</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            width: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            height: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            color: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.blue,</span></span>
<span class="line"><span style="color: #D4D4D4">          ),</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>AnimationController</strong>：アニメーションの進行を管理する基本クラスです。2秒間で0から1まで値を進行させます。</li>



<li><strong>CurvedAnimation</strong>：<code>AnimationController</code>にカーブを適用して、アニメーションの進行を曲線的に変更します。<code>Curves.easeInOut</code>で加速・減速するカーブを設定しています。</li>



<li><strong>AnimatedBuilder</strong>：アニメーションの値に基づいてウィジェットを再ビルドするためのウィジェットです。<code>Transform.scale</code>を使って、アニメーションの値に応じて拡大縮小を行います。</li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="curved animation demo" width="1256" height="707" src="https://www.youtube.com/embed/v00OEpq92xA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 class="wp-block-heading">Curvesの種類</h3>



<p class="wp-block-paragraph">Flutterでは、カーブの種類としてさまざまな<strong>プリセットカーブ</strong>が用意されています。代表的なものは以下の通りです。</p>



<ul class="wp-block-list">
<li><strong>Curves.linear</strong>：直線的なアニメーション。進行が一定の速度で行われます。</li>



<li><strong>Curves.easeIn</strong>：アニメーション開始時に加速します。</li>



<li><strong>Curves.easeOut</strong>：アニメーション終了時に減速します。</li>



<li><strong>Curves.easeInOut</strong>：開始時に加速し、終了時に減速します（今回使用）。</li>



<li><strong>Curves.bounceIn</strong>：弾むような動きで開始します。</li>



<li><strong>Curves.bounceOut</strong>：弾むような動きで終了します。</li>
</ul>



<h3 class="wp-block-heading">異なるカーブの適用例</h3>



<p class="wp-block-paragraph">同じアニメーションでも、カーブを変更することで異なる動きを表現できます。例えば、<code>Curves.bounceOut</code>を使用すると、アニメーション終了時に弾むような効果を持たせることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="_curvedAnimation = CurvedAnimation(
  parent: _controller,
  curve: Curves.bounceOut,  // 弾むようなカーブ
);" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">_curvedAnimation = </span><span style="color: #4EC9B0">CurvedAnimation</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">  parent: _controller,</span></span>
<span class="line"><span style="color: #D4D4D4">  curve: </span><span style="color: #4EC9B0">Curves</span><span style="color: #D4D4D4">.bounceOut,  </span><span style="color: #6A9955">// 弾むようなカーブ</span></span>
<span class="line"><span style="color: #D4D4D4">);</span></span></code></pre></div>



<h2 class="wp-block-heading">CurvedAnimationのメリット</h2>



<ol class="wp-block-list">
<li>より自然なアニメーションの実現
<ul class="wp-block-list">
<li><strong>CurvedAnimation</strong>を使うことで、直線的な動きよりも、より自然で視覚的に心地よいアニメーションが実現できます。アプリのユーザー体験を向上させるために、特定のタイミングで加速や減速を取り入れることが可能です。</li>
</ul>
</li>



<li>多様なアニメーションの作成
<ul class="wp-block-list">
<li>Flutterにはさまざまなカーブがプリセットされており、それらを組み合わせることで複雑なアニメーションを作成できます。シンプルな加速・減速だけでなく、弾むような動きや、ダイナミックなエフェクトを簡単に取り入れることが可能です。</li>
</ul>
</li>



<li>簡単な実装
<ul class="wp-block-list">
<li><strong>CurvedAnimation</strong>は非常にシンプルに実装できるため、初心者でも容易に扱えます。<code>AnimationController</code>にカーブを適用するだけで、カスタムアニメーションを実現できるのは大きな利点です。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph"><strong>CurvedAnimation</strong>を使うことで、アプリに自然な加速・減速を加えたアニメーションが実装でき、より魅力的なユーザー体験を提供できます。アニメーションの進行にさまざまなカーブを適用することで、単調な動きから脱却し、複雑でダイナミックな効果を簡単に実現できます。</p>



<p class="wp-block-paragraph">Flutterでアニメーションを導入する際は、<strong>CurvedAnimation</strong>を活用して、より洗練された動きを表現してみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-curved-animation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flutter開発入門52 FlutterでAnimationControllerの使い方</title>
		<link>https://techgrowup.net/flutter-animation-controller/</link>
					<comments>https://techgrowup.net/flutter-animation-controller/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 04:27:07 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Tween]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1975</guid>

					<description><![CDATA[はじめに アニメーションは、アプリケーションにインタラクティブ性や視覚的な魅力を加える強力なツールです。Flutterでは、AnimationControllerを使って高度なアニメーションを簡単に作成できます。このチュ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">アニメーションは、アプリケーションにインタラクティブ性や視覚的な魅力を加える強力なツールです。Flutterでは、<strong>AnimationController</strong>を使って高度なアニメーションを簡単に作成できます。このチュートリアルでは、<strong>AnimationController</strong>の基本的な使い方を紹介し、シンプルなアニメーションをFlutterで実装する方法を詳しく解説します。</p>



<p class="wp-block-paragraph"><strong>AnimationController</strong>は、アニメーションの進行状態を管理するために使用され、タイムラインのようにアニメーションを再生・停止・逆再生することが可能です。この記事を読めば、Flutterアプリにアニメーションを加える方法が理解でき、視覚的な要素を強化する手法を身につけることができます。</p>



<h2 class="wp-block-heading">AnimationControllerとは</h2>



<p class="wp-block-paragraph"><strong>AnimationController</strong>は、Flutterのアニメーションを制御するためのクラスで、アニメーションの進行を管理します。このコントローラーは、指定した期間に渡って0から1までの値を生成し、アニメーションの再生、停止、逆再生、ループなどを制御します。<strong>AnimationController</strong>を使うことで、簡単なアニメーションから複雑なアニメーションまで幅広く作成できます。</p>



<h3 class="wp-block-heading">主な特徴</h3>



<ul class="wp-block-list">
<li><strong>制御の自由度</strong>：アニメーションの再生、停止、逆再生、リピートなどを自由に制御可能。</li>



<li><strong>タイムラインの管理</strong>：アニメーションの進行を指定した時間で管理できる。</li>



<li><strong>連携可能</strong>：<code>Tween</code>などと連携することで、具体的な数値やカラーの変化をアニメーションで表現できる。</li>
</ul>



<h2 class="wp-block-heading">AnimationControllerを使ったアニメーションの基本</h2>



<h3 class="wp-block-heading">AnimationControllerのセットアップ</h3>



<p class="wp-block-paragraph">まず、<code>AnimationController</code>を使ってシンプルなアニメーションを作成する準備を行います。<code>AnimationController</code>は、<code>TickerProviderStateMixin</code>を使用してライフサイクルに合わせて適切に管理します。</p>



<h6 class="wp-block-heading">基本的なコード例</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/material.dart';

void main() =&gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AnimationExample(),
    );
  }
}

class AnimationExample extends StatefulWidget {
  @override
  _AnimationExampleState createState() =&gt; _AnimationExampleState();
}

class _AnimationExampleState extends State&lt;AnimationExample&gt; with TickerProviderStateMixin {
  late AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,  // TickerProvider
    )..repeat(reverse: true);  // アニメーションの繰り返し
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimationController Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (context, child) {
            return Transform.scale(
              scale: _controller.value + 1,  // 値の範囲を1-2にする
              child: child,
            );
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">());</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatefulWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createState</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4">&gt; </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TickerProviderStateMixin</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4"> _controller;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller = </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      duration: </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      vsync: </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">,  </span><span style="color: #6A9955">// TickerProvider</span></span>
<span class="line"><span style="color: #D4D4D4">    )..</span><span style="color: #DCDCAA">repeat</span><span style="color: #D4D4D4">(reverse: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);  </span><span style="color: #6A9955">// アニメーションの繰り返し</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;AnimationController Example&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">AnimatedBuilder</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          animation: _controller,</span></span>
<span class="line"><span style="color: #D4D4D4">          builder: (context, child) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Transform</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">scale</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              scale: _controller.value + </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">,  </span><span style="color: #6A9955">// 値の範囲を1-2にする</span></span>
<span class="line"><span style="color: #D4D4D4">              child: child,</span></span>
<span class="line"><span style="color: #D4D4D4">            );</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">          child: </span><span style="color: #4EC9B0">Container</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">            width: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            height: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            color: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.blue,</span></span>
<span class="line"><span style="color: #D4D4D4">          ),</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>AnimationController</strong>：2秒間のアニメーションを設定しています。<code>vsync: this</code>は、<code>TickerProviderStateMixin</code>を使ってアニメーションのパフォーマンスを最適化しています。</li>



<li><strong>repeat(reverse: true)</strong>：アニメーションを繰り返し実行し、逆方向にもアニメーションする設定です。</li>



<li><strong>AnimatedBuilder</strong>：アニメーションの状態に応じてUIを再ビルドします。<code>_controller.value</code>の値を使用して、四角のサイズが変わるアニメーションを作成しています。</li>



<li><strong>Transform.scale</strong>：スケール（拡大・縮小）アニメーションを適用し、<code>_controller.value</code>に基づいてサイズを動的に変更します。</li>
</ul>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="flutter animation controller" width="1256" height="707" src="https://www.youtube.com/embed/egMB8V_Ciqc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Tweenを使ったアニメーションの強化</h2>



<p class="wp-block-paragraph">次に、<code>Tween</code>を使って値の範囲を指定することで、アニメーションの動きをさらにカスタマイズする方法を見てみましょう。</p>



<h3 class="wp-block-heading">Tweenの基本</h3>



<p class="wp-block-paragraph"><code>Tween</code>を使えば、数値の変化を任意の範囲で制御できます。たとえば、アニメーションの進行に応じて色や位置、サイズなどを変化させることが可能です。</p>



<h3 class="wp-block-heading">Tweenを使ったサンプルコード</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class _AnimationExampleState extends State&lt;AnimationExample&gt; with TickerProviderStateMixin {
  late AnimationController _controller;
  late Animation&lt;Color?&gt; _colorAnimation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 3),
      vsync: this,
    )..repeat(reverse: true);

    _colorAnimation = ColorTween(begin: Colors.blue, end: Colors.red).animate(_controller);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Color Tween Animation Example'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _controller,
          builder: (context, child) {
            return Container(
              width: 100,
              height: 100,
              color: _colorAnimation.value,  // 色をアニメーション
            );
          },
        ),
      ),
    );
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_AnimationExampleState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">AnimationExample</span><span style="color: #D4D4D4">&gt; </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TickerProviderStateMixin</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4"> _controller;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Animation</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Color</span><span style="color: #D4D4D4">?&gt; _colorAnimation;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">initState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller = </span><span style="color: #4EC9B0">AnimationController</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      duration: </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Duration</span><span style="color: #D4D4D4">(seconds: </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      vsync: </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    )..</span><span style="color: #DCDCAA">repeat</span><span style="color: #D4D4D4">(reverse: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    _colorAnimation = </span><span style="color: #4EC9B0">ColorTween</span><span style="color: #D4D4D4">(begin: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.blue, end: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.red).</span><span style="color: #DCDCAA">animate</span><span style="color: #D4D4D4">(_controller);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    _controller.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">dispose</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Color Tween Animation Example&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">AnimatedBuilder</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          animation: _controller,</span></span>
<span class="line"><span style="color: #D4D4D4">          builder: (context, child) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Container</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              width: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">              height: </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">              color: _colorAnimation.value,  </span><span style="color: #6A9955">// 色をアニメーション</span></span>
<span class="line"><span style="color: #D4D4D4">            );</span></span>
<span class="line"><span style="color: #D4D4D4">          },</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">解説</p>



<ul class="wp-block-list">
<li><strong>ColorTween</strong>：青色から赤色への変化をアニメーションします。<code>begin</code>と<code>end</code>で色の範囲を指定します。</li>



<li><strong>_colorAnimation</strong>：<code>Tween</code>によるアニメーションの値を管理します。</li>



<li><strong>Containerのcolor</strong>：<code>Tween</code>によってアニメーションされた色を、<code>Container</code>の色に反映させています。</li>
</ul>



<figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="flutter animation tween" width="1256" height="707" src="https://www.youtube.com/embed/9-6Bw2r2Yfk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">AnimationControllerを使ったその他の操作</h2>



<h3 class="wp-block-heading">アニメーションの停止・再開</h3>



<p class="wp-block-paragraph"><code>AnimationController</code>を使えば、アニメーションの再生や停止も簡単に制御できます。以下のメソッドを使用して、アニメーションをコントロールします。</p>



<ul class="wp-block-list">
<li><strong>start()</strong>：アニメーションを開始する。</li>



<li><strong>stop()</strong>：アニメーションを一時停止する。</li>



<li><strong>reset()</strong>：アニメーションの状態をリセットする。</li>



<li><strong>forward()</strong>：アニメーションを前方向に再生する。</li>



<li><strong>reverse()</strong>：アニメーションを逆再生する。</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="FloatingActionButton(
  onPressed: () {
    if (_controller.isAnimating) {
      _controller.stop();
    } else {
      _controller.forward();
    }
  },
  child: Icon(Icons.play_arrow),
)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">FloatingActionButton</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">  onPressed: () {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (_controller.isAnimating) {</span></span>
<span class="line"><span style="color: #D4D4D4">      _controller.</span><span style="color: #DCDCAA">stop</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">      _controller.</span><span style="color: #DCDCAA">forward</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  child: </span><span style="color: #4EC9B0">Icon</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Icons</span><span style="color: #D4D4D4">.play_arrow),</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">ループアニメーション</h3>



<p class="wp-block-paragraph"><code>repeat()</code>メソッドを使うことで、アニメーションを無限に繰り返すことができます。また、<code>reverse: true</code>を指定すれば、逆方向にもアニメーションを実行します。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph"><strong>AnimationController</strong>を使えば、Flutterで高度なアニメーションを簡単に作成できます。今回紹介した基本的なスケーリングアニメーションや<code>Tween</code>による色の変化は、アプリに動的な要素を加えるための基本的な方法です。</p>



<p class="wp-block-paragraph">アニメーションは、アプリにインタラクティブなフィードバックを与える強力なツールです。<strong>AnimationController</strong>と<strong>Tween</strong>を活用して、より洗練されたアニメーションをFlutterアプリに追加してみてください。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-animation-controller/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
