2018年3月9日
プログラミング
アニメーションをつける【これからはじめるReact Native】
はじめに
前回はbutton
コンポーネントやそこから発動するイベント、またprops
などについてご紹介しました。
今回はアプリケーションに動きをつける、アニメーションについてご紹介していきます。
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),
}
こちらでstate
のanimation
にnew Animated.Value(0)
を設定しています。
state
は以前の記事でご紹介しましたね。こちらは初期化処理です。
では、new Animated.Value(0)
は何を意味しているのでしょうか。
こちらは後ほど出てきますが、今回アニメーションさせたいopacity
の値を0にしている(透明の状態)ものです。
そこからアニメーションさせているのが、次の部分です。
componentDidMount() {
Animated.timing(
this.state.animation,
{
toValue: 1,
duration: 10000,
}
).start();
}
componentDidMount
も以前の記事でコンポーネントライフサイクルでご紹介しましたね。
コンポーネントがマウント(画面上に表示)された直後に呼び出されるイベントでした。
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は別のアニメーションライブラリも開発もしていたのですが、そちらは開発が止まっておりこのライブラリのほうが活発なようです。
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
関連記事
2021年8月30日
React Navigation 6.0のStack Navigatorの大きく変わった箇所の変更点をまとめてみた
2021年1月4日
react-native-svgを使ってReact NativeでSVGを扱う
2019年12月23日
Expo Bare Workflow で Firebase Analytics を設定する
2018年12月6日
【React Native】キーボードで画面が隠れる場合の対処法
2018年7月13日
TypeScriptでReact Native開発をする方法2018年最新版
2018年6月29日
React Navigationのタブナビゲーションをカスタマイズしてみよう!
簡単に自分で作れるWebAR
「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。
palanARへpalanでは一緒に働く仲間を募集しています
正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。
運営メンバー
Eishi Saito 総務
SIerやスタートアップ、フリーランスを経て2016年11月にpalan(旧eishis)を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。
sasakki デザイナー
アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。
やまかわたかし デザイナー
フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。
Sayaka Osanai デザイナー
Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。
はらた エンジニア
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
こぼり ともろう エンジニア
サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。
ささい エンジニア
フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。
Damien
WebAR/VRの企画・開発をやっています。森に住んでいます。
ゲスト bagelee
かっきー
まりな
suzuki
miyagi
ogawa
雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。
いわもと
デザイナーをしています。 好きな食べ物はラーメンです。
taishi kobari
フロントエンドの開発を主に担当してます。Blitz.js好きです。
kubota shogo
サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!
nishi tomoya
aihara
グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。
nagao
SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。
Kainuma
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
sugimoto
asama
ando
iwasawa ayane
oshimo
異業界からやってきたデザイナー。 palanARのUIをメインに担当してます。 これからたくさん吸収していきます!