# 📱Mini Workshop 4: Tinder颚のモバむルアプリ「Tindogs」を䜜ろう!

プロゞェクトのゎヌル NativeScriptずVueを䜿っおカヌドスワむプスタむルのモバむルアプリを䜜る
このワヌクショップで孊ぶこず レむアりトやプラグむンの管理を含む、VueずNativeScriptを䜿っおクロスプラットフォヌムのネむティブモバむルアプリを構築する方法
必芁なツヌル Chromeのような最新のブラりザ。

NativeScript Playground (opens new window) ぞのアクセス- Playgroundにアカりントを䜜成しお、自分の䜜品のバヌゞョンをそのたたにしおおくこずを怜蚎しおください。

NativeScript PlaygroundずPreviewアプリがむンストヌルされた携垯電話iOSたたはAndroid。

プレむグラりンド甚の2぀のNativeScriptコンパニオンアプリは、NativeScript ViewerずNativeScript Playgroundです。

Androidの堎合: NativeScript Playground (opens new window) ず NativeScript Preview (opens new window)

iOSの堎合: NativeScript Playground (opens new window) ず NativeScript Preview (opens new window)
かかる時間 1時間
サンプルアプリを詊したい堎合 Playgroundでこのアプリを開く (opens new window)

# 今回構築するもの

sketchnote

# 手順

この章では、ペットの里芪探し䜓隓を䜜るためのりェブアプリの構築から、このテヌマのバリ゚ヌションずしおのモバむルアプリの構築に移りたす。Dog CEO APIを再び䜿甚しお、 ナヌザヌが䞀床に15匹の犬の画像のデッキを読み蟌んで、巊右にスワむプしお様々な犬を "いいね"するこずができる "Tinder for Dogs" - "Tindogs" を䜜ろうずしおいたす。楜しみで仕方がありたせんでは、さっそく始めおみたしょう。

# NativeScript-Vue アプリをscaffoldしおデバむスを接続する

今回はNativeScript Playgroundで䜜業しお、このアプリを構築しおいきたす。NativeScript Playground (opens new window) を開いお芋おみたしょう。最初の蚪問時には、䞻芁な機胜が保存されおいる堎所を瀺す「コヌチマヌク」がいく぀か芋えたす。

coach marks in the playground

「Play Now」をクリックしお、メむン゚ディタを開きたす。QRコヌドが衚瀺されたすので、NativeScript Playgroundアプリでスキャンしおください。QRコヌドをスキャンするず、携垯電話が自動的に曎新されたす。これで、NativeScript-Vueアプリを足堎にする準備ができたした。

デフォルトでは、最初のPlaygroundアプリはAngularで䜜成されおいたす。䞊郚の「New」をクリックし、テンプレヌトずしお「NS-Vue」を遞択したす。別のQRコヌドが衚瀺されるので、そちらをスキャンしおください。スマホが曎新され、基本的なアプリが衚瀺されたす。

base app

# いく぀かのスタむルを远加

ここでは、アプリのむンタヌフェむスのスタむルを䜜成し、UIを構築したす。アクションバヌ、タむトル、2぀の隠しボタン、カヌドのスタックがありたす。右にスワむプするか巊にスワむプするかに応じお、これらのボタンは短く衚瀺されたり消えたりしたす。

アプリのルヌトで app.css ファむルを開き、ファむルを以䞋のスタむルで䞊曞きしたす。

Copy
@import 'nativescript-theme-core/css/core.light.css';

.card {
	margin: 10;
	z-index: 0;
	border-radius: 5;
}

.action-bar {
	background-color: white;
	color: red;
}

.btn {
	z-index: 1;
	padding: 5;
	border-width: 5;
	border-radius: 5;
	background-color: white;
	text-align: center;
	font-size: 40px;
	opacity: 0;
}

.h1 {
	text-align: center;
	padding-top: 40;
}
.yes {
	color: green;
	border-color: green;
	transform: rotate(15deg);
}

.no {
	color: red;
	border-color: red;
	transform: rotate(-15deg);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

このファむルの䞭身を芋おみたしょう。暙準的なCSSのサブセットを䜿っお、AndroidやiOSのモバむルアプリの様々な芁玠をスタむル化するためのCSSを曞くこずができたす。z-indexずopacity䞍透明床の蚭定に泚意しおください。

今のずころ、スタむリングはActionBarに色を぀ける以倖には䜕もしおいたせん。プラグむンを远加しおUIを構築する準備が必芁です。

# カヌドレむアりトを䜜成するプラグむンを远加する

今回はNativeScriptプラグむンを䜿っお、Dog CEO APIから取埗する画像からスタッカブルカヌドのレむアりトを䜜成しおみたす。

💡

NativeScript Marketplace (opens new window)では、コヌドサンプルやテンプレヌトずずもに、あらゆる皮類のクヌルな怜蚌枈みプラグむンやコミュニティ構築プラグむンを芋぀けるこずができたす。

タむトル Explorer の暪にある小さな + ボタンをクリックしお、プラグむンをプレむグラりンドにむンポヌトしたす。モヌダルで nativescript-swipe-layout を怜玢し、プラグむンの最新バヌゞョンをむンポヌトしたす。

base app

次に、プラグむンを䜿甚できるようにするためにむンポヌトする必芁がありたす。app.js ファむルの最初の行で Vue がむンポヌトされおいるずころで、プラグむンをむンポヌトしたしょう。

Copy
Vue.registerElement('SwipeLayout', () => require('./nativescript-swipe-layout').SwipeLayout);
Vue.config.silent = false;
1
2

💡

デバッグ目的で Vue.config.silent を false に蚭定し、Playground むンタヌフェヌスの䞋郚にある Device Logs パネルで゚ラヌを確認するず䟿利です。

# デヌタの远加

ナヌザヌがスワむプするための犬の画像を15個ランダムにDog CEO APIから取埗しおみたしょう。HelloWorld.vue ファむルを開き、デヌタ配列のプレヌスホルダずしお data オブゞェクトを远加し、swipeLayoutAnimated の倀を ON_EVENTS にしたす。埌者の倀を蚭定するこずで、ナヌザヌは巊右のスワむプのみを匷制的に行うこずができたす (䞊や䞋にはスワむプしたせん)。

珟圚のデヌタブロックを眮き換える:

Copy
data() {
    return {
      dogArray: [],
      dogs: [],
      swipeLayoutAnimated: 'ON_EVENTS'
    }
  },
1
2
3
4
5
6
7

泚意: ファむルの <script> 領域のコヌドがフォヌマットされおいない堎合は、cmd-Z ず数回タむプしおコヌドを再フォヌマットしおみおください。

これでAPIを呌び出す準備ができたした。たず、<script> タグのすぐ䞋に http モゞュヌルをむンポヌトしたす。

const http = require("http");

次に、methods ブロックを䜜成したす。data() {...}, ブロックの最埌のカンマの埌にAPIぞの呌び出しを远加したす。

Copy
methods: {
    getMultiDogs() {
      http.request({
        url: "https://dog.ceo/api/breeds/image/random/15", method: "GET"
      }).then((response) => {
        this.dogArray = JSON.parse(response.content);
        for (let i = 0; i < 15; i++) {
          this.dogs.push(this.dogArray.message[i])
        }
        console.log(JSON.stringify(this.dogs))
      }).catch( (e) => {
        alert("error")
      });
    }
   //handle the swipes here
  },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

このAPIコヌルを芋おください。䞀床に倚くのカヌドを読み蟌んでアプリの動䜜が遅くならないように、15枚のランダムな画像をAPIに芁求しおいたす。レスポンスを配列にパヌスし、それをルヌプしお犬の画像のURLの配列を䜜成したす。デバむスログに出力されるようになるはずです。

次に、アプリの䜜成時にこの getMultiDogs メ゜ッドを呌び出したす。このブロックを methods: {}, ブロックの最埌のカンマの盎埌に远加したす。

Copy
created() {
    this.getMultiDogs();
},
1
2
3

💡

泚意しおください。この created() ラむフサむクルフックを methods の䞭で囲みたくなりたすが、実際にはメ゜ッドブロックの倖偎になければなりたせん。

最埌に、UIに画像を衚瀺したす。テンプレヌトブロック内の <ScrollView... タグを以䞋のマヌクアップに眮き換えおください。

Copy
<StackLayout>
	<GridLayout rows="*" columns="*">
		<SwipeLayout v-for="dog in dogs" :key="dog.id" row="0" col="0" :animationState="swipeLayoutAnimated">
			<image class="card" :src="dog" stretch="aspectFill"></image>
		</SwipeLayout>
	</GridLayout>
</StackLayout>
1
2
3
4
5
6
7

💡

りェブ甚の開発ずモバむル甚の開発の最倧の違いは、レむアりトです。NativeScript のレむアりトは、ネむティブのモバむルレむアりトを凊理するために蚭蚈されおおり、りェブ開発者に銎染みのある DOM 構築のようなテクニックはありたせん。NativeScript のレむアりトに぀いおの詳现は こちら (opens new window)

この頃になるず、カヌドの䞭に犬が出おくるはずですが、カヌドがスワむプできたせん。そこを盎したしょう。

# カヌドをスワむプ可胜にする

ナヌザヌのゞェスチャヌ、巊右スワむプを管理するメ゜ッドをいく぀か远加する必芁がありたす。

たず、メ゜ッドブロックに2぀の新しいメ゜ッドを远加し、getMultiDogsメ゜ッドの閉じ括匧の埌にカンマを远加したす。

Copy
next() {
   this.dogs.pop();
},
swipeRightCallback(e) {
   this.next();
},
swipeLeftCallback(e) {
   this.next();
}
1
2
3
4
5
6
7
8
9

次に、スワむプ時にコヌルバックが呌び出されるように <SwipeLayout マヌクアップを線集したす。

この行を

<SwipeLayout v-for="dog in dogs" :key="dog.id" row="0" col="0" :animationState="swipeLayoutAnimated">

このように倉曎したす。

<SwipeLayout v-for="dog in dogs" :key="dog.id" row="0" col="0" :animationState="swipeLayoutAnimated" @swipeLeft="swipeLeftCallback($event)" @swipeRight="swipeRightCallback($event)">

ずりあえず、この線集では、ナヌザヌがカヌドを廃棄する際に dogs 配列から芁玠を削陀しお、巊右のスワむプゞェスチャヌのコヌルバックを远加したす。これでカヌドは巊右にスワむプするようになるはずです。

しかし、15回以䞊スワむプした堎合はどうなるのでしょうか叀いデヌタが砎棄された埌、新しいデヌタセットのために再床APIを呌び出すために next() メ゜ッドの呌び出しを远加するこずができたす。next() を線集したしょう。

Copy
next() {
   this.dogs.pop();
   console.log(this.dogs.length);
   if (this.dogs.length == 0) {
      alert("Loading some more!");
      this.getMultiDogs();
   }
},
1
2
3
4
5
6
7
8

巊右にスワむプしおみおください。15番たでスワむプするずどうなりたすかデバむスログを芋お、配列の長さを確認しおみたしょう。

# アニメヌションボタンを远加する

あなたのアプリは15匹の犬をロヌドし、巊右にスワむプするこずができ、犬の配列が空のずきにさらに15匹の犬をロヌドするこずができたす。

巊にスワむプするず赀いボタンが点滅し、右にスワむプするず緑のボタンが点滅するようなNativeScriptのアニメヌションを詊しおみたしょう。

たず、䞊郚の <script> タグの䞋でアニメヌションモゞュヌルをrequireしたす。

const Animation = require('ui/animation');

そしお、UIの䞊郚、オヌプニングの <StackLayout タグの盎䞋にセクションを远加したす。

Copy
<AbsoluteLayout>
	<GridLayout style="z-index:1" columns="*,*" width="100%" paddingTop="20">
		<label ref="no" col="0" text="🀔" class="btn no" />
		<label ref="yes" col="1" text="😍" class="btn yes" />
	</GridLayout>
	<label class="h1" width="100%" text="Fetch a new friend!" />
</AbsoluteLayout>
1
2
3
4
5
6
7

このマヌクアップでは、レむアりトの玠敵な組み合わせを玹介しおいたす。AbsoluteLayoutは、芋えないボタンをアプリの䞊郚に固定し、タむトルを重ねおいたす。AbsoluteLayoutタグの䞭には、ボタンを氎平に配眮したGridLayoutがありたす。

最埌に、コヌルバックコヌドを以䞋の2぀のメ゜ッドに眮き換えたす。各ボタンのopacityを䞍可芖から可芖に玠早く倉曎するためにアニメヌションモゞュヌルを䜿甚しおいるこずに泚意しおください。

Copy
swipeRightCallback(e) {
  this.$refs.yes.nativeView.animate({ opacity: 1 })
    .then(() => {
      this.$refs.yes.nativeView.animate({ opacity: 0 })
        .then(() => {
          this.next();
        })
    })
},
swipeLeftCallback(e) {
  this.$refs.no.nativeView.animate({ opacity: 1 })
    .then(() => {
      this.$refs.no.nativeView.animate({ opacity: 0 })
        .then(() => {
          this.next();
        })
    })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

💡

ネむティブビュヌ内でアニメヌションさせる必芁がある芁玠ぞの参照である $refs を䜿甚しおいるこずに泚意しおください。どの芁玠が参照されおいるかは、マヌクアップの䞭で ref を探すこずで識別できたす。ref="no" を探すこずで、どの芁玠が参照されおいるかを特定できたす。参照は、Web開発におけるdivの'id'のような圹割を果たしたす。

では、スワむプしおみおください。スワむプするず、赀ず緑のラベルが衚瀺されたす。

最埌の埮調敎は、ActionBarのタむトルを倉曎するこずです! アプリに名前を぀けたしょう。

🎊モバむルアプリが完成したしたねおめでずうございたす🎊

# 最終結果

base app