38
アプリを弄ってみる 23.11.2011 Takahiro Yoshimura (@alterakey)

アプリを弄ってみる #2 #antama_ws

Embed Size (px)

Citation preview

Page 1: アプリを弄ってみる #2 #antama_ws

アプリを弄ってみる23.11.2011

Takahiro Yoshimura (@alterakey)

Page 2: アプリを弄ってみる #2 #antama_ws

自己紹介

こんな人

埼玉で活動するアーキテクトです。

最近Androidが仕事になりかけてます…?

Twitterやってます→@alterakey

Page 3: アプリを弄ってみる #2 #antama_ws

目標

タブレット描画アプリ

https://github.com/taky/effy

仕上げをやります。

Page 4: アプリを弄ってみる #2 #antama_ws

仕上げ?

ガクガクなので…

ガビガビなので…

Page 5: アプリを弄ってみる #2 #antama_ws

素材の準備

Eclipse+SDK (r14~)

0.1.6のソースを使います。

http://bit.ly/tCS6td

Page 6: アプリを弄ってみる #2 #antama_ws

素材の確認

Effyはビルドできますか?

Page 7: アプリを弄ってみる #2 #antama_ws

始めましょう。

ハードウェア支援を使えるようにします。

Page 8: アプリを弄ってみる #2 #antama_ws

手掛り

Android 3.0から追加された機能。GPUを活かして描画するようになります。

application/activityごとに指定するだけ

特段コーディングする必要なし!

Page 9: アプリを弄ってみる #2 #antama_ws

方針

AndroidManifest.xml

...<uses-sdk android:minSdkVersion="8" /><application ... android:hardwareAccelerated="true"> <activity android:name="MainActivity"...

Page 10: アプリを弄ってみる #2 #antama_ws

方針

project.properties

...# Project target.target=android-11

Page 11: アプリを弄ってみる #2 #antama_ws

次は

線の平滑化をしましょう。

ガビガビの線を…

Page 12: アプリを弄ってみる #2 #antama_ws

ところで…

線を書いているのはどこですか?

線がガビガビなのはなぜだと思いますか?

Page 13: アプリを弄ってみる #2 #antama_ws

手掛り

線を書いているのはDrawActivity

DA.onTouchEvent: タッチされた点を保存

DA.plot: 点や線を描く

Page 14: アプリを弄ってみる #2 #antama_ws

…?!

DrawActivity.java

private void plot(float x, float y){ ... canvas.drawLine(...); ...}

→直線を描いている!

Page 15: アプリを弄ってみる #2 #antama_ws

ここで

FingerPaint

API Demosに含まれている描画アプリ

滑らかな線が描けている…だと…?

Page 16: アプリを弄ってみる #2 #antama_ws

というわけで

研究だ!

samples/ android-X/ ApiDemos/ src/ com/example/android/apis/graphics/ FingerPaint.java

Page 17: アプリを弄ってみる #2 #antama_ws

何が違うのか?

Path(曲線)クラスを描画に使っている→線が滑らかに!

private void touch_move(float x, float y) { ... if (dx >= TOUCH_TOLERANCE... ) { mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); ... }}

Page 18: アプリを弄ってみる #2 #antama_ws

何が違うのか?

アンチエイリアスが有効になっている→輪郭が滑らかに!!

@Overrideprotected void onCreate(Bundle savedInstanceState) { ... mPaint.setAntiAlias(true); ...}

Page 19: アプリを弄ってみる #2 #antama_ws

何が違うのか?

描画方法がより直接的→より良い構造!!!

@Overridepublic boolean onTouchEvent(MotionEvent event) { ... case MotionEvent.ACTION_MOVE: ... invalidate();

Page 20: アプリを弄ってみる #2 #antama_ws

何が違うのか?

ScribblerではActivityが直接タッチ→描画まで面倒を見ている

ActivityはActivityで、他にもやることが…

Page 21: アプリを弄ってみる #2 #antama_ws

何が違うのか?

FingerPaintではタッチ→描画がViewレベルで分解されて独立している

タッチされるのも描かれるのもView

Page 22: アプリを弄ってみる #2 #antama_ws

何が違うのか?

関連性の高い処理が集まっている

Page 23: アプリを弄ってみる #2 #antama_ws

良い設計?

単一責任原則 (SRP)

「各クラス、責任はたった一つであるべし」

オブジェクト指向設計における重要な指針

Page 24: アプリを弄ってみる #2 #antama_ws

責任だと?

クラスが自分で直接面倒を見ていること

「私は~をやります」

他のクラスを使って実現していることは含まない

Page 25: アプリを弄ってみる #2 #antama_ws

責任

DrawActivityの責任はいくつありますか?

Page 26: アプリを弄ってみる #2 #antama_ws

方針

曲線を使って直接描く

アンチエイリアスを有効に

Page 27: アプリを弄ってみる #2 #antama_ws

方針

長いのでダウンロードして下さいhttp://bit.ly/rZFrWf

→ effy-0.1.6-draw2.zip

Page 28: アプリを弄ってみる #2 #antama_ws

方針

展開して出た2つのファイルをsrc/ com.gmail.altakey.effy へコピーします。

Page 29: アプリを弄ってみる #2 #antama_ws

確認しましょう

Effyをビルドして確認しましょう。

Page 30: アプリを弄ってみる #2 #antama_ws

最後に

線の両端を丸くしてみましょう→今は角マーカーで引いたような線

Page 31: アプリを弄ってみる #2 #antama_ws

手掛り

ペンの設定はまだDAで行なっている

Paintクラスがペンの実体

Page 32: アプリを弄ってみる #2 #antama_ws

方針

DrawActivity.java

private void initialSetup(){ ... this.paint.setStrokeCap(Paint.Cap.ROUND); ...}

Page 33: アプリを弄ってみる #2 #antama_ws

まとめ

高速化

ハードウェア支援の利用方法

直接描画する方が速い件

Page 34: アプリを弄ってみる #2 #antama_ws

まとめ

線の平滑化

Pathを使って滑らかな曲線を描く

Paintで線の種類を指定する

Page 35: アプリを弄ってみる #2 #antama_ws

まとめ

似たようなアプリは研究しよう

FingerPaintの方が構造が良かった件

単一責任原則

Page 36: アプリを弄ってみる #2 #antama_ws

お疲れさまでした。

コードはgithubにあるので (GPL-3)、ガンガン研究してください!

他にもText Viewer (dawne)Lightboxdroid (lucene) …など。

Page 37: アプリを弄ってみる #2 #antama_ws

余談

Android 3.1でメニューが出ない件について。

今回の高速化・平滑化の過程で、図らずも解決してしまいました!

Page 38: アプリを弄ってみる #2 #antama_ws

ご静聴ありがとうございました。