2018年3月9日

プログラミング

アニメーションをつける【これからはじめる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 などを実際に使ってみてリッチなサンプルアプリも作り、その記事も今後公開していきたいと考えています。

React Nativeのお仕事に関するご相談

Bageleeの運営会社、palanではReact Nativeに関するお仕事のご相談を無料で承っております。
zoomなどのオンラインミーティング、お電話、貴社への訪問、いずれも可能です。
ぜひお気軽にご相談ください。

無料相談フォームへ

1'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),12)||'

1

AUTHOR

eishis

Eishi Saito 総務

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

アプリでもっと便利に!気になる記事をチェック!

記事のお気に入り登録やランキングが表示される昨日に対応!毎日の情報収集や調べ物にもっと身近なメディアになりました。

簡単に自分で作れるWebAR

「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。

palanARへ
palanar

palanはWebARの開発を
行っています

弊社では企画からサービスの公開終了まで一緒に関わらせていただきます。 企画からシステム開発、3DCG、デザインまで一貫して承ります。

webar_waterpark

palanでは一緒に働く仲間を募集しています

正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。

話を聞いてみたい

運営メンバー

eishis

Eishi Saito 総務

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

sasakki デザイナー

アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。

yamakawa

やまかわたかし デザイナー

フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。

Sayaka Osanai デザイナー

Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。

はらた

はらた エンジニア

サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています

kobori

こぼり ともろう エンジニア

サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。

sasai

ささい エンジニア

フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。

damien

Damien

WebAR/VRを中心に企画・マークアップ・開発をやっています。森に住んでいます。

ゲスト bagelee

ゲスト bagelee

かっきー

かっきー

まりな

まりな

suzuki

suzuki

taro

taro

xR界隈のビズをやっています。新しいガジェットとか使うのが好きです。あとお寿司は玉子のお寿司が好きです。

miyagi

ogawa

ogawa

雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。

いわもと

いわもと

kobari

taishi kobari

フロントエンドの開発を主に担当してます。Blitz.js好きです。

shogokubota

kubota shogo

サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!

nishi tomoya

aihara

aihara

グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。

nagao

SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。

CONTACT PAGE TOP