GDG中国 イベント参加ログ¶
Contents:
GDG Cafe¶
GDG cafe #13 (https://gdgchugoku.doorkeeper.jp/events/25316)¶
実施日¶
2015/05/25 18:00〜20:30
お題目¶
- Android Studioに慣れる
- Androidオープンソースライブラリ徹底活用 を参考に、ライブラリを使ってみる
使ってみたライブラリ¶
- 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
お題目¶
- Android Studioに慣れる
- Androidオープンソースライブラリ徹底活用 を参考に、ライブラリを使ってみる
使ってみたライブラリ¶
- aFile Chooser
前回、「ASでライブラリプロジェクトを導入する方法って?」ということで、結局タイムアップになってしまったんだけど、今日はそのやり方を復習するためライブラリプロジェクト提供されているものをチョイス。
ライブラリプロジェクトで提供されているものは、だいたいEclipse/ADTで作成されている場合がほとんど、という認識だったんだけど、こいつもご多分にもれずbuild.gradleが付属していないので、以下の手順で対応。
- ライブラリプロジェクトのzipをほどいたあと、ASで New -> Import moduleを実行
- インポートウィザード(?)が起動するので、すべてのチェックが入っていることを確認して「次へ」
- 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
お題目¶
- GDG DevFest 2015 Summerで行われたセッション資料 で公開されている、Androidの新機能を試す
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開発者サービスのバージョンを判断して、使用可否を判断する必要あり
コンパニオンアプリ(母艦側にインストールする、ウォッチフェイスの設定を行うアプリ)を用意できる
アニメーションは、ハンドヘルドと同じ手法で実装可能
基本パターン
- 背景
- アナログ時計(目盛り、数字、針、午前午後表示、など)
- カレンダー(年月日+曜日)
ハイブリッド時計をデザインする
昼/夜で切り替える
ハンドヘルドから取得した情報を表示する
作成すべきリソース
- ランチャーアイコンは不要
- ウォッチフェイスのサムネイル画像は必須(プログラムで動的生成できない)
- ウォッチフェイスの背景画像は、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の便利なところを学ぶ
本日の資料¶
- エラー訂正(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.gradle
にtestInstrumentationRunner
の設定を入れないと、ライブラリを依存に追加していてもテストが実行されないので注意- ユニットテストのソースコードは、すでにプロジェクト生成時に置き場所が掘られている(
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さんのグループ企業で通販できるようになる、とのこと