1. ホーム
  2. React Native
  3. アニメーションをつける【これからはじめるReact Native】

アニメーションをつける【これからはじめるReact Native】

目次

  1. はじめに
  2. アニメーションをつけてみる
  3. アニメーション関係のライブラリ
  4. まとめ

はじめに

前回はbuttonコンポーネントやそこから発動するイベント、またpropsなどについてご紹介しました。

buttonとイベント【これからはじめるReact Native】


今回はアプリケーションに動きをつける、アニメーションについてご紹介していきます。
React、React Nativeにおいてよく言われるのが、アニメーションがあまり得意ではないということです。
もちろん今回ご紹介するような動きはできますが、複雑なものとなると作ることが難しいものもあります。
ですが、外部のライブラリでリッチなアニメーションを実現しているものもありますので、そちらも最後にご紹介していきます。

アニメーションをつけてみる

では、まずいつものようにExpoのSnack Appを開きましょう。
サンプルのカード部分だけにアニメーションをつけてみます。
公式リファレンス のサンプルを元にしたアニメーションをつけてみます。

完成品はこのようなイメージです。
アニメーション

ゆっくり画像が浮かび上がってきていますね。

では、これを実現しているソースコードを見ていきます。

今回はカード部分だけにアニメーションをつける為、AssetExample.jsを編集しています。

import React, { Component } from 'react';
import { Animated, Text, View, StyleSheet, Image } from 'react-native';
export default class AssetExample extends Component {
state = {
animation: new Animated.Value(0),
}
componentDidMount() {
Animated.timing(
this.state.animation,
{
toValue: 1,
duration: 10000,
}
).start();
}
render() {
let { animation } = this.state;
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
Local files and assets can be imported by dragging and dropping them into the editor
</Text>
<Animated.View
style={{
opacity: animation,
}}
>
<Image style={styles.logo} source={require("../assets/expo.symbol.white.png")}/>
</Animated.View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
alignItems: 'center',
justifyContent: 'center',
},
paragraph: {
margin: 24,
marginTop: 0,
fontSize: 14,
fontWeight: 'bold',
textAlign: 'center',
color: '#34495e',
},
logo: {
backgroundColor: "#056ecf",
height: 128,
width: 128,
}
});

では、今回主に変更している点を解説していきます。

import { Animated, Text, View, StyleSheet, Image } from 'react-native';

こちらでAnimatedコンポーネントをインポートしています。

  state = {
animation: new Animated.Value(0),
}

こちらでstateanimationnew Animated.Value(0)を設定しています。
state は以前の記事でご紹介しましたね。こちらは初期化処理です。

では、new Animated.Value(0) は何を意味しているのでしょうか。
こちらは後ほど出てきますが、今回アニメーションさせたいopacityの値を0にしている(透明の状態)ものです。

そこからアニメーションさせているのが、次の部分です。

  componentDidMount() {
Animated.timing(
this.state.animation,
{
toValue: 1,
duration: 10000,
}
).start();
}

componentDidMount も以前の記事でコンポーネントライフサイクルでご紹介しましたね。
コンポーネントがマウント(画面上に表示)された直後に呼び出されるイベントでした。

APIから値を取得し表示する 【これからはじめるReact Native】


Animated.timing ですが、「これから定義するタイミングでイージングしていきます」という宣言です。

POINT!!

イージングとは、なめらかな動きをする為の「アニメーションの緩急」です。例えば今回のようにふわっと表示される演出についても、全て同じタイミングではなく、ゆっくりとはじまりゆっくりと終わる「easeInOut」のイージングがかかっています。
React NativeではEasingライブラリをimportし、Animatedにプロパティを設定することで、このイージングの変更が可能です。
詳しくはこちらのEasingに関するリファレンスをご覧ください。

次にでアニメーションを適用するstateを指定しているのがこちらです。

      this.state.animation,

そしてこちらはアニメーションに関するプロパティです。

      {
toValue: 1,
duration: 10000,
}

ここでは、opacityを1(不透明)に10秒(10000ミリ秒)かけてアニメーションさせてね、という指定をしています。
そして最後の

.start();

Animated.timing を開始させています。

では、次にrender() 配下を見ていきます。

  render() {
let { animation } = this.state;
return (
<View style={styles.container}>
<Text style={styles.paragraph}>
Local files and assets can be imported by dragging and dropping them into the editor
</Text>
<Animated.View
style={{
opacity: animation,
}}
>
<Image style={styles.logo} source={require("../assets/expo.symbol.white.png")}/>
</Animated.View>
</View>
);
}
}

let { animation } = this.state; では、stateの値をanimationという変数に格納しています。

そしてアニメーションを表示させているのがこちらです。

        <Animated.View
style={{
opacity: animation,
}}
>
<Image style={styles.logo} source={require("../assets/expo.symbol.white.png")}/>
</Animated.View>

Animated.View でアニメーションを表示させます。
opacityに先程格納したanimationという変数の値をセットしていますね。

stateの初期化をこのようにした際にはanimation には0が、そして先程のAnimated.timing処理では10秒をかけてopacityの値をイージングしていった値がanimationに入ります。

  state = {
animation: new Animated.Value(0),
}

他にもものを移動させる為の書き方などもありますが、今回はアニメーションの基本ということでまた次回以降に解説していきます。

アニメーション関係のライブラリ

今回、アニメーションをご紹介し「少し煩雑だ」と感じられた方もいると思います。
とくにより複雑な動きを作る為には、並行したアニメーションイベントの発動や、様々な組み合わせが必要で時間がかかるかもしれません。
そこで、React Nativeでリッチなアニメーションを作るライブラリをご紹介します。

react-native-animatable

react-native-animatableは、とても簡単な実装で様々なアニメーションを実現できるライブラリです。

<Animatable.Text animation="slideInDown" iterationCount={5} direction="alternate">Up and down you go</Animatable.Text>
<Animatable.Text animation="pulse" easing="ease-out" iterationCount="infinite" style={{ textAlign: 'center' }}>❤️</Animatable.Text>

サンプルにもあった、これくらいのコードで

こんな動きが実現できます。

また、こんな動きや


こんな動きもサポートされています。

リポジトリ

react-native-interactable

こちらはWixが開発しているライブラリです。
Wixは別のアニメーションライブラリも開発もしていたのですが、そちらは開発が止まっておりこのライブラリのほうが活発なようです。

UIとしてスマホだと嬉しいこんな動きも実現可能です。

リポジトリ

react-native-svg

こちらは直接アニメーションを実現できるライブラリではないですが、SVGとして描画できるライブラリです。
こちらにアニメーション要素を掛け合わせることで、eishisでリリースしているダイエットアプリ、ゆるっぷるでもこのような動きを実現しています。
ゆるっぷる

リポジトリ

まとめ

今回はアニメーションについて導入部分をご紹介しました。
もう少しアプリの複雑な動きにおいての実装方法等は、また別途ご紹介していきます。
またreact-native-animatable などを実際に使ってみてリッチなサンプルアプリも作り、その記事も今後公開していきたいと考えています。

Author Profile

eishis
eishis
SIerやスタートアップ、フリーランスを経て2016年11月にeishis, Inc.を設立。
マーケター・ディレクター・エンジニアなど何でも屋。
COBOLからReactまで色んなことやります。

この記事は
参考になりましたか?

PAGE TOP