Ionic Framework-カメラで動作します

画像



最初のトピックの調査結果によると、 Ionic Framework (以降IF)に関する一連の記事続けています。 今日は、デバイスのカメラでの作業について説明し、さらにlocalStorageでの作業についても説明します。 基礎として、過去のトピックからアプリケーションを取得し、必要な機能を追加します。







ngCordovaの追加



インストールされたプラグインを機能させるには、ngCordovaモジュールを追加する必要があります。 簡単に説明します(最初の記事の公開から多くの時間が経過したため、最初にツールを更新します)。



sudo npm i -g cordova ionic bower bower install ngCordova
      
      





次に、ngCordovaがindex.htmlで接続されます:



 <script src="lib/ngCordova/dist/ng-cordova.min.js"></script>
      
      





アプリケーション(app.js)に応じて:



 angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter.services'])
      
      





そうしないと、列車はできなくなります...デバイスのFSを操作するために、さらに2、3のプラグインを接続することをお勧めします。



 ionic plugin add cordova-plugin-file ionic plugin add cordova-plugin-file-transfer
      
      





理論的には、ファイル転送のみを接続することが可能です。なぜなら、 それに加えて、ファイルもプルしますが、このメソッドは理解できないバグの出現を伴うことがあります...



カメラを操作するためのプラグインを接続する



IFがデバイスのカメラにアクセスできるようにするには、機能実装するプラグインを Cordovaプロジェクトに追加する必要があります。



 ionic plugin add cordova-plugin-camera
      
      





プラグインは単一のメソッドを提供します:



 navigator.camera.getPicture(SuccessCallback, ErrorCallback, Options);
      
      





SuccessCallbackとErrorCallbackは、必要なものを自由に記述できるハンドラー関数ですが、Optionsオブジェクトを検討するのは非常に興味深いです。



カメラ設定
  • quality(数値):保存された画像の品質。範囲は0〜100です。100は非圧縮モードです。 デフォルト値は50です。
  • destinationType(数値):戻り値の形式。 デフォルトはFILEURIです。 カスタマイズは、navigator.camera.DestinationTypeタイプによって決定されます。

     Camera.DestinationType = { DATA_URL : 0, //    base64 FILE_URI : 1, // URI  NATIVE_URI : 2 // URI     (assets-library://  iOS  content://  Android) };
          
          



  • sourceType(数値):画像ソース。 デフォルトはCAMERAです。 構成は、navigator.camera.PictureSourceTypeタイプによって決定されます。

     Camera.PictureSourceType = { PHOTOLIBRARY : 0, CAMERA : 1, SAVEDPHOTOALBUM : 2 };
          
          



  • allowEdit(ブール値):関数に渡す前に単純編集モードを有効にします。
  • encodingType(数値):ファイル形式。 デフォルトは「jpegがあります」です。 カスタマイズは、navigator.camera.EncodingTypeタイプによって決定されます。

     Camera.EncodingType = { JPEG : 0, // JPEG PNG : 1 // PNG };
          
          



  • targetWidth(数値):幅。 コメントはありません。 スケーリングする。 係数を指定してtargetHeightと組み合わせて使用​​することをお勧めします。
  • targetHeight(数値):高さ。
  • mediaType(数値):マルチメディアコンテンツのタイプ。 デフォルトはPICTUREです。 PictureSourceTypeがPHOTOLIBRARYまたはSAVEDPHOTOALBUMの場合に機能します。 設定は、タイプnagivator.camera.MediaTypeによって決定されます。

     Camera.MediaType = { PICTURE: 0, //  . VIDEO: 1, //   (  FILE_URI) ALLMEDIA : 2 //   };
          
          



  • correctOrientation(ブール値):撮影中に画像を回転させて、デバイスの向きを補正します。
  • saveToPhotoAlbum(ブール値):撮影後にアルバムに保存します。
  • popoverOptions:iPad上のポップオーバーの場所を指定するiOS専用のパラメーター。 設定は、CameraPopoverOptionsで定義されています。
  • cameraDirection(数値):使用するカメラ(前面または背面)。 デフォルトはBACKです。 構成は、navigator.camera.Directionタイプによって決定されます。

     Camera.Direction = { BACK : 0, // Use the back-facing camera FRONT : 1 // Use the front-facing camera };
          
          







それは基本的に言うことができるすべてです...





カメラを操作するためのサービスを作成する



カメラでの作業が快適になるように、便宜のためにサービスをしましょう。 これを行うには、コールバックを使用してカメライベントを処理するpromiseオブジェクトでファクトリを実装することを提案します。 services.jsファイルを開き(前のトピックで、すでにそこに都市の工場を作成しました)、このフォームにそれをもたらします:



services.js
 angular.module('starter.services', []) .factory('Cities', function() { // ... }).factory('Cam', function($q) { return { getPic: function(opt) { var q = $q.defer(); navigator.camera.getPicture(function(res) { q.resolve(res); }, function(err) { q.reject(err); }, opt); return q.promise; } }; });
      
      







そのため、この設定では、Angularの$ q.defer ()を使用してpromiseを返します。その後、カメラにイベントハンドラー(SuccessCallback、ErrorCallback)と設定オブジェクト(Options)を渡します。 ファイルを閉じないでください、戻ってきます!



テンプレートを編集する



tabs.htmlファイルを開き、別のタブを追加します 。 私はこれを得ました:



  <ion-tab title="Options" icon-off="ion-gear-a" icon-on="ion-gear-a" href="#/tab/opt"> <ion-nav-view name="tab-opt"></ion-nav-view> </ion-tab>
      
      





次に、テンプレートフォルダーに別のテンプレート(たとえばtab-opt.html )を作成し、次のような小さなアプリケーションユーザー構成フォームを作成します。



tab-opt.html
 <ion-view view-title=""> <ion-content class="padding"> <div class="list-item"> <img class="full-image" ng-src="{{user.ava || './img/ionic.png'}}"> <label class="item item-input"> <i class="icon ion-person placeholder-icon"></i> <input type="text" placeholder=" " ng-model="user.name" ng-keyup="setUser();" /> </label> <label class="item item-input item-select"> <div class="input-label">  </div> <select ng-model="user.city" ng-change="setUser();"> <option ng-repeat="city in cities" ng-value="city.id">{{city.name}}</option> </select> </label> <button class="button button-full button-positive" ng-click="getPic(1);">   </button> <button class="button button-full button-calm" ng-click="getPic(0);">   </button> </div> </ion-content> </ion-view>
      
      







ご覧のとおり、ユーザーモデルをフィールドにアタッチし、htmlフィールドの値が変更されると、オブジェクトの対応するフィールドがモデル内で変更されます。 また、キーがリリースされたときのイベント(ここでデバウンスを使用できます)および都市の選択を変更するために、setUserハンドラーがバインドされました。これについては次のステップで説明します。 実行して見るのが待ちきれませんか? ただし、ルーティング、コントローラー、およびlocalStorageの操作をまだ構成していないため、もう少し待つ必要があります...



ルート、コントローラー、およびファクトリーの追加



ルートから始めましょう。 app.jsを開き、新しいタブのルーティングを追加します。



ヒント
 .state('tab.opt', { url: '/opt', views: { 'tab-opt': { templateUrl: 'templates/tab-opt.html', controller: 'OptCtrl' } } })
      
      







では、 controllers.jsに行き、必要なコントローラーを追加しましょう。



Optctrl
 .controller('OptCtrl', function($scope, $ionicPopup, Cities, Cam, LS) { $scope.cities = Cities.all(); $scope.user = LS.getIt('user') || {}; $scope.showAlert = function(title, text) { $ionicPopup.alert({ title: title, template: text }); }; $scope.setUser = function() { LS.setIt('user', $scope.user); }; $scope.getPic = function(source) { var opt = { sourceType: source }; Cam.getPic(opt).then(function(res) { $scope.user.ava = res; $scope.setUser(); }, function(err) { $scope.showAlert("", err); }); } })
      
      







おっと、コントローラの依存関係にはどのようなLSがありますか!? 何も恐れない、これはlocalStorageを操作するための単なるメソッドであり、それを実装する時です( services.js ):



LS
 .factory('LS', function() { return { getIt: function(item) { var it = false; try { it = JSON.parse(localStorage.getItem(item)); return it; } catch(e) { console.err(e); return it; } }, setIt: function(item, obj) { try { localStorage.setItem(item, JSON.stringify(obj)); return true; } catch(e) { console.err(e); return false; } } }; })
      
      







そして、さらに都市を追加する必要があるでしょう、あなたの都市を追加してください:



 { id: 555312, name: '', desc: ' ', emblem: 'https://upload.wikimedia.org/wikipedia/commons/8/8f/Coat_of_Arms_of_Ivanovo_oblast.png' }
      
      





あなたはおそらく「なぜこんなに多くのジェスチャーをするのか?」と思うでしょう。 ユーザーが都市を設定し(localStorageに自動的に保存する)、アプリケーションを再起動するとすぐに故郷の天気にスローされます! 最後の最後の記事では、前回の記事で作成した2つのコントローラーを変更しましょう。



CityCtrl、CityDetailCtrl
 .controller('CityCtrl', function($scope, Cities, LS) { $scope.cities = Cities.all(); $scope.user = LS.getIt('user') || {}; if ($scope.user.city) { window.location.href = '#/tab/city/'+$scope.user.city; } }) .controller('CityDetailCtrl', function($scope, $http, $stateParams, $ionicPopup, $ionicLoading) { $scope.data = {}; $scope.id = $stateParams.id; $scope.showAlert = function(title, text) { $ionicPopup.alert({ title: title, template: text }); }; $scope.refresh = function() { $ionicLoading.show(); $http.get('http://api.openweathermap.org/data/2.5/forecast/daily?id='+$scope.id+'&appid=2de143494c0b295cca9337e1e96b00e0') .success(function(data, status, headers, config) { $scope.data = data; $ionicLoading.hide(); $scope.$broadcast('scroll.refreshComplete'); }) .error(function(data, status, headers, config) { $ionicLoading.hide(); $scope.showAlert(status, data); $scope.$broadcast('scroll.refreshComplete'); }); }; $scope.refresh(); })
      
      







ユーザーが構成された都市にジャンプする条件を追加し、依存関係の$ ionicLoadingコンポーネントを静かに示して、リクエスト中に待機ウィンドウを表示します。 何も見逃していないこと、すべての準備ができていること、願っていることを知っていることを願っています(イオンサーブ-忘れた場合はラボ):



うまくいく!






おわりに



原則として、IFの使用は現在、より便利で簡単になっているため、これはプロトタイピング、さらには実稼働アプリケーションにとっても最高のフレームワークの1つであると断言できます。 がんばれ! 次の記事では、socket.ioを使用してチャットを作成し、他の興味深いものを操作する方法について説明します。 以下の記事に問題、質問、提案がある場合は、PMでお待ちしています!



All Articles