[初心者] Ionic4でPhoto Gallery アプリを作ってみる
おはようございます、もきゅりんです。
先日、弊社のテウさんから教えてもらったIonicに興味持ったので、AngularのチュートリアルAppをやってみました。
やってみた結果、すごーいって思いました。
こういった写真を撮るアプリが1時間以内で出来ました。
こちら、自分の実機画面です。
世の中すごいことだらけですね。
元ネタはYour First Ionic App: Angularです。
自分はIonic自体には全然詳しくないので、チュートリアルをやってみた結果、さらっと進められているな、と思った点を補足的に書いていこうと思います。
興味が湧いた際は、是非上記チュートリアルと一緒に開いて進めていって頂ければと思います。
なお、Ionicの導入については下記ブログをご参照下さい。
目次
アプリの作成 / 起動
とりあえず、npmは利用できるとして言われた通りに進めていきます。
# Install Ionic and Cordova npm install -g ionic cordova
アプリはblank,tabs,sidemenuのどれかから作成できるのですが、tabが3つあるもので作成します。「photo-gallery」はアプリ名になります。
# Create an App ionic start photo-gallery tabs
下記のコマンドでブラウザ起動します。
# Run the App ionic serve
実機で確認できるようにする
Cordovaというオープンソースフレームワークから iOS と Android のプラットフォームを追加します。
ionic cordova platform add ios ionic cordova platform add android
この後、設定するIonic DevAppで確認するために、src/index.html
に以下のように追記します。
<head> <!-- ... Other HTML tags... --> <script src="cordova.js"></script> </head>
ご自身のモバイルデバイスにIonic DevAppをインストールします。
インストールして、アプリを開くとこのような画面が表示されるので、サインアップします。
それから下記コマンドで、先ほどのように起動すると、
ionic serve --devapp
デバイス上のDevAppにこんなのが表示されて
開発中のアプリが(自身の)実機で見れます。
Wow! 自分は単純なので、これだけで結構感動しました。
あとは言われた通りに進めていけば問題ないのですが、写真の保存させる部分が(どこに何をやるのかというところが)ちょっと分かりづらかったので補足しておきます。
写真を保存して表示させる
Android, iOS, and the Camera - Oh My! までが完了しているとします。
データのやり取りを担うサービスを作成します。
ionic g service services/Photo
写真を保存するため、SQLite pluginを追加します。
ionic cordova plugin add cordova-sqlite-storage npm install --save @ionic/storage
photo.service.ts
にPhotoクラスを追加します。
データのやり取りはサービスで管理させるため、tab2.page.ts
にあるtakePictureメソッドをphoto.service.ts
に移します。
そして、tab2.page.ts
にそのphoto.serviceをインポートします。
最終的に photo.service.ts
はこんなです。
import { Injectable } from '@angular/core'; import { Storage } from '@ionic/storage'; import { CameraOptions, Camera } from '@ionic-native/camera/ngx'; @Injectable({ providedIn: 'root' }) export class PhotoService { public photos: Photo[] = []; constructor(private camera: Camera, private storage: Storage) {} takePicture() { const options: CameraOptions = { quality: 100, destinationType: this.camera.DestinationType.DATA_URL, encodingType: this.camera.EncodingType.JPEG, mediaType: this.camera.MediaType.PICTURE }; this.camera.getPicture(options).then( imageData => { // Add new photo to gallery this.photos.unshift({ data: 'data:image/jpeg;base64,' + imageData }); // Save all photos for later viewing this.storage.set('photos', this.photos); }, err => { // Handle error console.log('Camera issue: ' + err); } ); } loadSaved() { this.storage.get('photos').then((photos) => { this.photos = photos || []; }); } } class Photo { data: any; }
tab2.page.ts
に撮った写真がロードされるようにngOnInitを追加します。
import { Component } from '@angular/core'; import { PhotoService } from '../services/photo.service'; @Component({ selector: 'app-tab2', templateUrl: 'tab2.page.html', styleUrls: ['tab2.page.scss'] }) export class Tab2Page { currentImage: any; constructor(public photoService: PhotoService) {} ngOnInit() { this.photoService.loadSaved(); } }
そしたら、写真を取ってみます。
ダニエルくんという仮面です。
そしたら、冒頭の写真ギャラリーとなるわけです。
Angularを理解していればなんてことはないのですが、慣れていないと、どこに何をやるんだっけ??と若干自分は迷ってしまったため、まとめてみました。
何より驚きの共有欲求が大きかったです。(今更なのですが)
テウさんありがとう!
以上です、どなたかのお役に立てば幸いです。