GDG中国 イベント参加ログ

Contents:

GDG Cafe

GDG cafe #13 (https://gdgchugoku.doorkeeper.jp/events/25316)

実施日

2015/05/25 18:00〜20:30

お題目

使ってみたライブラリ

Butter Knife

AndroidAnnotations の代わりに使ってみた。

AndroidAnnotationsは強力な反面、Activityのソースをアノテーションプロセッサで生成させるという、半ば黒魔術的な手法を使っているため、副作用が強い。

こちらはViewのインジェクションに特化した仕様なので、副作用も小さく、安心して使うことができた。

ActiveAndroid

普段は OrmLite を使っているが、違ったアプローチのO/Rマッパを調査してみた。

DBのファイル名やバージョンといった常套句の部分をManifestに書く仕様なのは、ある意味ありがたいが、Modelクラスの定義もManifestに書かなければならないようで、Modelが増えたときの管理が大変そう。

UnifiedPreference

Preferenceの画面をお手軽に作ってくれるらしい。というので調査。

jCenterにライブラリが登録されているので、build.gradleに1行書くだけで適用できる、はずなのだが、落ちてくるのがapklib形式のため、Android Studioでは使用できない。

Preference画面を作りたいがためにプロジェクトをaarに固め直すのも、なんだか本末転倒な感じがする。

組織内にプライベートビルドのライブラリを置くためのMavenリポジトリがあるなら、使ってみる手はあるかもしれないが。

GDG cafe #14 (https://gdgchugoku.doorkeeper.jp/events/25747)

実施日

2015/05/31 18:00〜20:00

お題目

使ってみたライブラリ

aFile Chooser

前回、「ASでライブラリプロジェクトを導入する方法って?」ということで、結局タイムアップになってしまったんだけど、今日はそのやり方を復習するためライブラリプロジェクト提供されているものをチョイス。

ライブラリプロジェクトで提供されているものは、だいたいEclipse/ADTで作成されている場合がほとんど、という認識だったんだけど、こいつもご多分にもれずbuild.gradleが付属していないので、以下の手順で対応。

  1. ライブラリプロジェクトのzipをほどいたあと、ASで New -> Import moduleを実行
  2. インポートウィザード(?)が起動するので、すべてのチェックが入っていることを確認して「次へ」
  3. Gradleビルドが始まるので、ビルド終了後、Project Structureでアプリケーションモジュールにライブラリ依存を定義
ZXing

個人的な本日の本題。

「書籍の裏に書かれているISBNのバーコードを読み取って書籍を検索するアプリ」というのを作っていて、読み取りにZXingを使っていたんだけど、カメラのプレビューをZXingに渡しても「読めるバーコードなんてねぇよ」と怒られていて、解決方法が見つからなかったので再挑戦、という次第。

公式のドキュメントを読んでみたら、 build.gradle に書いていた内容が微妙にまずかったようだ、という結論にいたり、dependenciesブロックの調整を行ってみたんだけど、解決には至らず。

むぅ、ZXing 3.3でどうやったらちゃんとバーコードを読めるんだろう?

というところまでやって、今日はバッテリーが尽きた。

GDG cafe #15 (https://gdgchugoku.doorkeeper.jp/events/27467)

実施日

2015/06/28 18:00〜20:00

お題目

Design Support Library

compile 'com.android.support:design:22.0.0'build.gradle に追加することで、Material Designの実装をサポートしてくれるらしい。

実は未検証(汗)。

Design Editor

デザイナーさん向けのGUIデザインエディタ。

AS 1.3 beta 1にしていたが、mipmapの中身を触るのを忘れていたため、こちらも未検証(汗)。

なお、Gradle 2.4にしないとダメとのことだが、AS 1.3になるとAS内蔵のGradleが2.4になるので、これに引きずられてプロジェクトのGradle Wrapperも2.4になる(はず)。

Gradle 2.4になると、遅かったコンパイルが速くなるらしい。

Native Support

Open GL使いが待ち望んだ、ASでのNDKサポート。

JetBrainsのC/C++ IDEである CLion の機能が取り込まれる予定だが、NDKを本格的に操るようなプロジェクトを用意していなかったことと、 そもそもAS 1.3 beta 1ではまだCLionの機能がマージされていないため、お話だけ。

なお、Android Gradle pluginによるNDKのビルド自体は、以前から対応できていて、NDKのインストールディレクトリを指定する箇所は、Setting内に用意されてはいる。

なので、あと一歩な印象なのだが、ここまで引っ張られると JetBrainsとの交渉が難儀しているんじゃないの? と邪推してしまう。

Enforcing Annotations

Support Library 19.1から、 Support Annotations という パラメータ検証を目的としたアノテーションライブラリ が追加された。

最新の環境では、誤ったパラメータ指定をIDEが教えてくれるようになる。 gradle lint の実行でも同様。

ただしこれを使う場合、

  • Gradleプラグインを1.3.0-beta1にする
  • Android M Previewのplatform toolsをインストールする

が必要。

また、Threading Annotationsとして紹介されている以下を、要求されているスレッド以外から呼ぼうとすると、上記lintの対象となる。

  • @UiThread
  • @MainThread
  • @WorkerThread
  • @BinderThread

なお、Androidの場合UIスレッド=メインスレッドなのは周知の事実だし、 @UiThread@MainThread は、双方とも狭義のメインスレッド上で実行されるメソッドに付加するが、この使い分けは

@MainThread
ライフサイクルに関連するメソッドに対して
@UiThread
上記以外の、UIスレッド上で実行すべきメソッドに対して

とするのがよい、とのこと。

Data Binding

XMLに定義したビューに対し、POJOとの紐づけが簡単にできるようになる。

割と詳しい使用方法については、 こちらのQiitaの記事 を参照いただきたい。

記事を読む限りでは、悪名高い findViewById(int) を(ある程度は)駆逐できそうな印象。

実は、個人的に一番の収穫だった。が、 テストを書くにあたっては落とし穴がある らしい(汗)。

番外編

GDG四国

DevFest Shikoku Android Wear Watch Face ハンズオン

とりあえず箇条書き的にメモ。

実施日

2015/11/28 13:00 - 18:00

お題目
  • Android Wearのウォッチフェイスをつくる
その1:座学
  • Android Wearのばあい、時計デザインを自力で起こすことができる

  • 時計アプリは「Watch Face」と呼ばれ、Watch Face APIを使用して自由にWatch Faceを作成できる

  • 最近の機種は高解像度化してきているので、ハンドヘルド同様複数解像度に対応する必要も出てきている

  • ウォッチフェイスアプリについては、数が少ない今がチャンス

  • Google Playストアでの検索性がお世辞にもよろしくない上に、ほとんどは海外製で似たようなデザインが多い

  • 日本製は少ない

  • ほとんど無料だが、カスタマイズ機能はIn-App Billingになっていることが多い

  • 有料は概ねUSD1.00-程度のため、お小遣い稼ぎには厳しいかも

  • デザインするにあたり、どのようなものが公開されているかを確認したほうがいい

  • 実機のハンドヘルドがあれば、WearのPCエミュレータにインストールして確認できる

  • デザインに際して

    • 時間が一目で確認できること

    • 角型、丸型の両方に対応していること

    • Interactive、Ambientの両モードで違和感ないデザインとする

    • Ambientのばあい、発色数は大幅に制限を受け、焼きつき防止措置への対応も考慮する必要あり

    • これらはAPIで取得可能

    • システムUI要素も、APIで表示位置を制御できる

    • 「デザイン = コンテキスト + データ」と認識する

    • interactiveは最近リリースされたばかりの機能

    • Interactiveでは、ウォッチフェイスへのタップイベントを検出できるようになった

    • ただし、使えるジェスチャーはシングルタップのみで、スワイプやピンチアクションはシステムで予約されていて使用できない

    • パターン

      • タップすると表示を切り替える
      • タップするとActivityを差し込む
      • などなど
    • ただし、対応するにはGoogle Play開発者サービスのバージョンを判断して、使用可否を判断する必要あり

    • コンパニオンアプリ(母艦側にインストールする、ウォッチフェイスの設定を行うアプリ)を用意できる

    • アニメーションは、ハンドヘルドと同じ手法で実装可能

    • 基本パターン

      1. 背景
      2. アナログ時計(目盛り、数字、針、午前午後表示、など)
      3. カレンダー(年月日+曜日)
    • ハイブリッド時計をデザインする

    • 昼/夜で切り替える

    • ハンドヘルドから取得した情報を表示する

    • 作成すべきリソース

      • ランチャーアイコンは不要
      • ウォッチフェイスのサムネイル画像は必須(プログラムで動的生成できない)
      • ウォッチフェイスの背景画像は、Interactive、Ambientでそれぞれ用意する
    • アナログ時計の場合、長針、短針、秒針の3つの画像を最低用意できれば、回転表示で対応できる

    • APIのみでベクター描画する方法もある(目盛りは三角関数で計算できる)

    • デジアナのハイブリッドの場合、最初のプロジェクト作成ウィザードでデジタル、アナログをそれぞれ作成しておき、それぞれを適宜流用して実装するとやりやすい。

  • 単純なデジタル時計(アニメーションなし)であれば、600行程度で実装できてしまう

  • キャラクターものの場合、著作権者に問い合わせをしておくこと(重要)

その2:ハンズオン
  • Intaractiveを試したかったので、ハンドヘルドをAPI 18、WearをAPI22とし、デジタルのウォッチフェイスプロジェクトを生成
  • Wearに関しては、実機よりもエミュレータのほうが動作が軽快らしい。エミュレータのストレージ設定は、規定から強化しておいたほうが、何かと便利とのこと
  • プロキシが間に挟まっていると、起動時にHTTP_PROXYオプションを設定しておく必要がある
  • 開発者モードを有効にする方法は、ハンドヘルドと同じ
  • Wearの言語設定を強制変更するには、 adb shell で対応できる
  • ウィザードで作ったプロジェクトをそのままビルドしても、時計として動作するようになっている
  • 挙動を変えたい場合、インナークラスにある Engine#onDraw(Canvas, Rect) から手を付ける。背景画像もここで設定する
  • 同じく、表示の微調整を行うには Engine#onApplyWindowInsets(WindowInsets) で実施する
  • 実機ごとに画面サイズが異なるため、画像サイズの調整は Engine#onSurfaceChangad(SurfaceHolder, int, int, int) にて行う
  • ベクター描画するアナログの場合、角度計算したあと、 Canvas自体を回転させたあと 描画して戻す、いう手法で対応すると楽
  • Ambientモードに入ると onAmbientModeChanged(boolean) が発生するので、ここでアンチエイリアスの設定変更等を行い、 invalidate() をコールする
  • プレビュー画像は AndroidManifest.xml 内のservice→metaタグに、drawableを指定しているところがあるので、変更するときはここをいじる
  • BroatcastReceiverのregister/unregisterのタイミングは、 onVisibilityChanged(boolean) で行う

Android Studio開発講座

実施日

2015/12/12 13:00 - 17:30

演者

有山 圭二さん

お題目

Android Studioの便利なところを学ぶ

本日の資料

https://goo.gl/T7awKh

  • エラー訂正(Jump to Next Error)
    • [F2] を押す
    • Alt + Enter で修正候補をリストアップしてくれる
    • Alt + Enter は、リテラルで書いている部分を string.xml に追い出したり
  • コード生成(Code generation)
    • Alt + Insert
    • Getter/Setterを一括生成できる
    • インスタンスフィールドの先頭に「m」を付加していると、生成されたGetter/Setterにも「m」が付加された状態で生成されてしまう
    • 防ぎたければ、IDEの設定を「コードスタイルでプレフィックスを除去する」よう変更するか、個別に Alt + Enter で追加する
  • リファクタリング
    • インラインの記述をローカル変数に移動
      • Ctrl + Alt + V
      • 逆に、ローカル変数をメンバー変数にしたい場合は Ctrl + Alt + F
    • 処理をメソッドに切り出す
      • Ctrl + Alt + M
    • 名前を変更
      • Shift + F6
      • Javaソース上のものだけでなく、XMLリソースに設定されているView IdやAndroidManifest.xmlの更新もやってくれる
  • ユニットテスト(JUnit 4)
    • テストは、将来の自分のために積み立てておこう
    • junit4以外にも、Support Annotationsとtest Runnerライブラリが必要
    • build.gradletestInstrumentationRunner の設定を入れないと、ライブラリを依存に追加していてもテストが実行されないので注意
    • ユニットテストのソースコードは、すでにプロジェクト生成時に置き場所が掘られている( src/AndroidTest/java )ので、そこにパッケージを一致させて配置すればよい
    • テストの実行は、Gradleの connectedAndroidTest タスクを実行する
    • テストは「接続された機器」で実行されるが、1.5からはAndroidに依存しないテストをJVM上で実行できるようになり、そのためのソース配置場所である src/test/java が用意されている。当然、APKを生成して実機に送る現状の方法よりも、テスト実行は断然速い。

質問タイム

  • AndroidからMySQLのDbサーバにアクセスしたい
    • JDBCドライバを駆使すれば、できないことはない
    • ただし、Androidはapkのリバースエンジニアリングが容易なため、これをやると何が起こるかわからない
    • したがって、面倒でもAPIを設計、実装したほうがいい
  • Android Studioから自前のGradleタスクを自動的に実行したい
    • Gradleタスクツリーのother以下に、自前のGradleタスクが追加されている
    • 実行させたいタスクを assembleDebug.dependsOn(タスク名) に定義すると、assembleDebugタスクの実行前に定義したタスクが実行されるようになる
    • ライブラリのJarファイルを吐くときなどに活用できる
  • 既存のプロジェクトをインポートする際のポイント
    • 今年の冬コミで頒布されるとのこと(乞うご期待)
    • TechBoosterの書籍は、Pixivさんのグループ企業で通販できるようになる、とのこと