アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer

38,320 views

Published on

0 Comments
16 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
38,320
On SlideShare
0
From Embeds
0
Number of Embeds
309
Actions
Shares
0
Downloads
79
Comments
0
Likes
16
Embeds 0
No embeds

No notes for slide

アプリ開発・端末毎の解像度の違いを吸収する方法 Android Bazaar and Conference 2011 Summer

  1. 1. アプリ開発 端末毎の解像度の 違いを吸収する方法 プロの方はご遠慮ください ! 株式会社 PM9 野田邦昌
  2. 2. 自己紹介 <ul><li>PM9 雑用係 野田邦昌 </li></ul><ul><li>たまたま「 OpenWnn フリック ( 入力対応版 ) 」 というものを開発 </li></ul><ul><li>先日、 おっさんの仲間入り をはたしました。 誕生日が来たとかということではなく、 </li></ul><ul><li>             ある意味悟りの境地というか </li></ul><ul><li>座右の銘は 「押してだめなら引いてみろ」 </li></ul>
  3. 3. 自己紹介 <ul><li>「会社名の由来は?」って良く聞かれます。 よっぽど「 あやしいん 」でしょうか。 </li></ul><ul><li>「株式会社 PM9 」に対する一般的なイメージ </li></ul><ul><li>ナイスミドルな方は、「え? 11PM 」となるらしい。 </li></ul><ul><ul><li>※ 11PM( テレビの 深夜番組  巨泉さん とか 欽也さん出演 ) </li></ul></ul><ul><li>ナイスミドルで、なおかつ 常識的 な方は… </li></ul><ul><ul><li>心の声 : 「まさか、そんな 露骨 なわけない」 </li></ul></ul><ul><ul><li>表の声 : 「 PM ( プロマネ ) が 9 人いらっしゃると !! 」 </li></ul></ul><ul><ul><li>心の声 : 「けっ  ハッタリが ! 」となる傾向にあります </li></ul></ul>
  4. 4. 自己紹介 <ul><li>フレッシュな方は… 「やっぱ、あれ系ですか ? ♡   僕もやってみたいです」 </li></ul><ul><li>たぶん、 ご想像されているものとは違う と思います。 やってもらってもかまいませんが 。 というか、 むしろありがたい。 </li></ul>
  5. 5. 俺の開発スタイル (Android も含めて ) <ul><li>気持ちの良いアプリを   気持ちよく作ってますか?      サクッと !! </li></ul><ul><li>(PM9) 野田の場合  一日の過ごし方 </li></ul>
  6. 6. 結論 <ul><li>気持ちよく作る って言うのは、ちょっと どうやって良いのか 分からない けれども、 </li></ul><ul><li>気持ちの良いアプリ ( を作る ) ってのは、 どうにかなる のかもしれない。 </li></ul><ul><li>たぶん !! </li></ul>
  7. 7. 結論 <ul><li>斬新なアイデアが、 1 つあれば十分 </li></ul><ul><li>もちろん、斬新すぎて理解不能なのはちょっと </li></ul><ul><li>小奇麗であれば十分 </li></ul><ul><li>違和感を感じる部分をコツコツと直していく   … ここ結構 重要 </li></ul><ul><li>アイデアはお客さんがくれる </li></ul>
  8. 8. やっと本題 -- アプリケーション開発における様々な端末特性の考慮 <ul><li>端末 ( 機種 ) 毎に特性が違います。 </li></ul><ul><ul><li>・ OS バージョン </li></ul></ul><ul><ul><li>・画面サイズ・画面密度 </li></ul></ul><ul><ul><li>・色々なセンサーなどのデバイスの有無とか特性 </li></ul></ul><ul><li>放って置いても、自動的にやってくれる… というわけにはいかない ときがある。 </li></ul>
  9. 9. 開発者としては、一応勉強してアプリを作っているつもりなんだけれども <ul><li>マーケットのコメント欄は… </li></ul><ul><li>普段からでも 「へーそんな使い方できるんだ~」 って 開発者でさえ気づかないような使い方 でコメントされるわけですが、 </li></ul>
  10. 10. 開発者としては、一応勉強してアプリを作っているつもりなんだけれども <ul><li>マーケットのコメント欄は… </li></ul><ul><ul><li>「~ ( 機種名 ) で動きません。」 </li></ul></ul><ul><ul><li>「 OS アップデートしたら、落ちるようになりました。」 </li></ul></ul><ul><ul><li>「端っこの方が見えません。」 </li></ul></ul><ul><li>× 開発者としては、思っても見なかった非難に さらされた </li></ul><ul><li>○ 有り難い助言をいただいた </li></ul>
  11. 11. 開発者は何をしているのだ? <ul><li>開発者のみなさん、結構まじめです。 </li></ul><ul><ul><li>Android エミュレーター (AVD ってやつ ) を 使ってテスト </li></ul></ul><ul><ul><li>手元にある実機でテスト </li></ul></ul><ul><li>お約束のテストは当然行います。 </li></ul>
  12. 12. 開発者は何をしているの? <ul><li>でも、実機だと何故かエラーが </li></ul><ul><li>「マニュアル見りゃ分かるだろうがー」となりますが、 いえ、わかりません 。 </li></ul><ul><li>特にセンサーのようなデバイスまわりの API 情報が足りてません 。 </li></ul><ul><li>全ての種類の端末で試すのは無理 </li></ul><ul><li>情報を共有する手段を持つ </li></ul><ul><li>法則性を見つけて、計画的に問題を回避 </li></ul>
  13. 13. ちょっと、一言 端末特性情報共有サービスのご提案 <ul><li>(1) 「端末特性テスト」アプリというものを Android マーケットで配布。 </li></ul><ul><li>(2) Android アプリ開発者等を含む Android ユーザーは このアプリをダウンロードして実行する。 すると、クラウド上のサーバーに下記の情報がアップロードされる。 </li></ul><ul><ul><li>端末機種名 </li></ul></ul><ul><ul><li>OS バージョン </li></ul></ul><ul><ul><li>各入出力デバイスの有無とかスペックとか </li></ul></ul><ul><ul><li>ROM を焼いてたらその情報も </li></ul></ul><ul><ul><li>API を使ってデバイスにアクセスした場合、 どんなことが起るのか、どんな値を得ることができるのか </li></ul></ul><ul><ul><li>   ( これが一番重要 ) </li></ul></ul><ul><ul><li>※ どの API を試すのかは、 Android アプリ開発者からの リクエストを元に </li></ul></ul>
  14. 14. 端末特性情報共有サービスのご提案 <ul><li>(3) アップロードされた各端末の特性情報は、 誰でも参照可能 </li></ul><ul><ul><li>Android アプリ開発者は、これを見てへんな動きをする等の原因が掴めるようになる。 </li></ul></ul><ul><ul><li>奇特な開発者は、誰でも簡単に統一した仕様でデバイスに アクセスできるラッパー用のライブラリを作って配布する。 </li></ul></ul><ul><ul><li>商品として売っても良し。 </li></ul></ul><ul><ul><li>メーカーさんとしては、ちゃんと仕様どおりに 作っておられるわけだけれども、 他のメーカーさんの端末特性を見ることで新しい発見とか あるでしょ? </li></ul></ul>
  15. 15. まずは、 Android コーディングのおさらい    - プロジェクト <ul><li>HogeHoge / </li></ul><ul><li>AndroidManifest.xml </li></ul><ul><li>src / </li></ul><ul><li>com.fuga.hogehoge / </li></ul><ul><li>HogeHogeActivity.java …  画面表示 </li></ul><ul><li>res / </li></ul><ul><li>layout / </li></ul><ul><li>hogehoge.xml …   UI 定義 ( レイアウト + UI 部品 ) </li></ul><ul><li>drawable / </li></ul><ul><li>icon.png </li></ul><ul><li>hoge.png …  画像等 </li></ul><ul><li>values / </li></ul><ul><li>strings.xml …  文字列定数 </li></ul><ul><li>gen / </li></ul><ul><li>com.fuga.hogehoge / </li></ul><ul><li>R.java …  ビルドすると自動生成される </li></ul>
  16. 16. Android コーディングのおさらい - プロジェクト <ul><li>R.java って? </li></ul><ul><li>ビルドすると自動生成される。 </li></ul><ul><li>リソース ID と リソースインデックス の関係が記述されている。 </li></ul><ul><ul><li>リソース ID : res ディレクトリ下のパス名 + リソースの各項目の id 属性 から決定される。 android:id=“ @+id/button_1 ”   プログラムからは、 R.id.button_1 で参照 </li></ul></ul><ul><ul><li>リソースインデックス : 全てのリソースに自動的に通し番号が割り振られる。 </li></ul></ul>
  17. 17. おさらい - UI の構成要素 <ul><li>ViewGroup   ( ようするにレイアウト ) </li></ul><ul><ul><li>例 ) LinerLayout とか TableLayout とか </li></ul></ul><ul><ul><li>子 View の配置方法などを指定して、 View の追加ができる </li></ul></ul><ul><ul><li>ViewGroup を子供として配置可能 </li></ul></ul><ul><li>View   (UI 部品のこと ) </li></ul><ul><ul><li>例 ) Button とか EditText とか </li></ul></ul><ul><li>LayoutParams    ( レイアウトの為のパラメータ ) </li></ul><ul><ul><li>View の配置のしかたを指定 </li></ul></ul><ul><li>※ 感覚的には HTML に近い </li></ul>
  18. 18. おさらい - UI 定義 XML によるレイアウト定義 <ul><li>HogeHoge / res / layout / hogehoge.xml </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li>< LinearLayout xmlns:android= http://schemas.android.com/apk/res/android </li></ul><ul><li> android:id=“@+id/hoge_id” </li></ul><ul><li>    android:orientation=&quot;vertical&quot; </li></ul><ul><li>    android:layout_width =&quot;fill_parent&quot; </li></ul><ul><li>    android:layout_height =&quot;fill_parent&quot;> </li></ul><ul><li>    < Button </li></ul><ul><li>  android:id=&quot;@+id/button_2&quot; </li></ul><ul><li>  android:layout_width =&quot;fill_parent&quot; </li></ul><ul><li>  android:layout_height =&quot;wrap_content&quot; </li></ul><ul><li>  android:text=&quot;Button 2&quot;/> </li></ul><ul><li></ LinearLayout > </li></ul>
  19. 19. おさらい - UI 定義 XML による定義 <ul><li>Java からは、こんな感じで利用する。 </li></ul><ul><li>public class HogeHogeActivity exteds Activity { </li></ul><ul><li>public void onCreate ( Bundle   savedInstanceState) { </li></ul><ul><li>super.onCreate(savedInstanceState); </li></ul><ul><li>setContentView ( R.layout.hogehoge ); </li></ul><ul><li>  } </li></ul><ul><li>} </li></ul><ul><li>HogeHoge/ res/layout/hogehoge.xml に基づいて画面が描画される。 </li></ul>
  20. 20. おさらい - UI 定義 Java から定義 <ul><li>レイアウト XML を用いず、 動的に UI を生成 </li></ul><ul><li>public class HogeHogeActivity extends Activity { </li></ul><ul><li>public void onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super.onCreate(savedInstanceState); </li></ul><ul><li>LinearLayout layoutHogehoge = new LinearLayout(this); </li></ul><ul><li>setContentView( layoutHogehoge ); </li></ul><ul><li>Button button1 = new Button(this); </li></ul><ul><li>button1 .setText(&quot;Button&quot;); </li></ul><ul><li>layoutHogehoge .addView( </li></ul><ul><li> button1 , </li></ul><ul><li> new LinearLayout.LayoutParams ( </li></ul><ul><li>ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  21. 21. おさらい - レイアウト用 XML を Java から読み込んで弄くる <ul><li>(1) hogehoge.xml </li></ul><ul><li>(2) fugafuga.xml </li></ul><ul><li>setContentView( R.layout.hogehoge ); </li></ul><ul><li>LinearLayout layoutHogehoge = (LinearLayout)findViewById( R.id.hoge_id ); </li></ul><ul><li>LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService( </li></ul><ul><li>Context.LAYOUT_INFLATER_SERVICE); </li></ul><ul><li>LinearLayout layoutFugafuga = </li></ul><ul><li> (LinearLayout) inflater .inflate( R.layout.fugafuga , null); </li></ul><ul><li>layoutHogehoge .addView( layoutFugafuga ); </li></ul>
  22. 22. いよいよ端末特性  Android における 「画面サイズ」の分類 <ul><li>small ~ 3.7 inch ぐらい </li></ul><ul><li>normal 3.x ~ 4.x inch ぐらい </li></ul><ul><li>large 4 ~ 7 inch ぐらい </li></ul><ul><li>xlarge 7 inchi 以上 </li></ul>
  23. 23. Android における 「画面密度」の分類 <ul><li>dpi = Dot per inch </li></ul><ul><li>一般的な CRT 、 LCD は、 72 ~ 96dpi </li></ul><ul><li>印刷物は 300 ~ 350dpi 以上のピクセル密度となっている </li></ul><ul><li>ldpi </li></ul><ul><ul><li>低密度 ( 実測値 :100 ~ 140dpi) システム上は 120 dpi として扱う </li></ul></ul><ul><li>mdpi </li></ul><ul><ul><li>中密度 ( 実測値 : 140 ~ 180dpi) システム上は 160 dpi として扱う </li></ul></ul><ul><li>hdpi </li></ul><ul><ul><li>高密度 ( 実測値 : 190 ~ 250dpi) システム上は 240 dpi として扱う </li></ul></ul><ul><li>xhdpi </li></ul><ul><ul><li>システム上は 320 dpi として扱う </li></ul></ul>
  24. 24. Android における 「アスペクト比」の分類 <ul><li>アスペクト比 ( 画面の縦横比 ) が 4:3 ~ 16:9 の間におさまっているか? </li></ul><ul><ul><li>not-long おさまっている </li></ul></ul><ul><ul><li>long おさまっていない </li></ul></ul>
  25. 25. Android における 「オリエンテーション」の分類 <ul><li>画面が縦向き / 横向きの状態 </li></ul><ul><ul><li>port 縦向き </li></ul></ul><ul><ul><li>land 横向き </li></ul></ul>
  26. 26. Android における長さの単位 (1) <ul><li>px -- いわずと知れたピクセル単位 (pixel) </li></ul><ul><li>dp もしくは dip device-independent pixel ( 端末非依存ピクセル ) </li></ul><ul><li>※ dpi じゃなくて dip </li></ul><ul><li>mdpi(160dpi) の機種の 物理的なピクセル幅 (px) を基準とした単位 </li></ul>
  27. 27. Android における長さの単位 (1) <ul><li>dp 続き… </li></ul><ul><li>中解像度 mdip(160dpi) の機種 (HT-03A 等 ) 上に 32px x 32px のサイズの「箱」を描いた </li></ul><ul><li>物差しではかったらどれも大体約 5mm x 5mm ぐらいの「箱」が描かていることになる。 </li></ul><ul><li>中解像度 mdip(160dpi) の機種 (HT-03A 等 ) 上に 32dip x 32dip のサイズの「箱」を描いた </li></ul><ul><li>高解像度 hdpi(240dpi) の機種 (Xperia arc 等 ) 上に 32dip x 32dip のサイズの「箱」を描いた </li></ul>
  28. 28. Android における長さの単位 (2) <ul><li>sp もしくは sip Scale-independent Pixels ( 倍率非依存ピクセル ) </li></ul><ul><li>dp に似ているが 標準文字サイズ という情報も 考慮 して調整してくれるという 何か良い具合 な単位 フォントサイズの指定 に使うお約束 ※ ポイント指定じゃないのね </li></ul>
  29. 29. Android における長さの単位 (2) <ul><li>pt -- 言わずと知れたポイント = 1/72 インチ </li></ul><ul><li>in -- インチ </li></ul><ul><li>mm -- ミリメートル </li></ul>
  30. 30. <ul><li><resource> </li></ul><ul><li>< dimen name=&quot; hogehoge_text_size &quot;>12sp</dimen> </li></ul><ul><li>< dimen name=&quot;hogehoge_icon_sp&quot;>32dp</dimen> </li></ul><ul><li></resource> </li></ul><ul><li>とやっておいて、名前で指定できちゃいます。 </li></ul><ul><li><TextView </li></ul><ul><li>android:textSize=&quot;@ dimen / hogehoge_text_size &quot; </li></ul><ul><li>... </li></ul><ul><li>/> </li></ul>長さに名前を付けることができます
  31. 31. 長さに名前を付けることができます <ul><li>ちなみに、 Java からもアクセスできちゃいます。 </li></ul><ul><li>float txSize = </li></ul><ul><li> Resources.getDimension ( R.dimen . hogehoge_text_size ); </li></ul>
  32. 32. レイアウト (1) <ul><li>基本は、 res/layout 下にレイアウト用 XML を置く </li></ul><ul><li>HogeHoge / res / layout / hogehoge.xml </li></ul><ul><li>ところで、 魔法のようなことが … </li></ul><ul><li>HogeHoge / res </li></ul><ul><li>layout </li></ul><ul><li>hogehoge.xml </li></ul><ul><li>layout -xlarge </li></ul><ul><li>hogehoge.xml <= </li></ul><ul><li> ここにレイアウト用 XML を置くと… </li></ul><ul><li>画面サイズが 7inch ( つまり xlarge ) のタブレットだと こちらのレイアウトが… </li></ul>
  33. 33. レイアウト (2) <ul><li>されにさらに、 </li></ul><ul><li>HogeHoge / res / </li></ul><ul><li>layout / </li></ul><ul><li>hogehoge.xml </li></ul><ul><li>layout -xlarge / </li></ul><ul><li>hogehoge.xml </li></ul><ul><li>layout -xlarge-land / </li></ul><ul><li>hogehoge.xml <= </li></ul><ul><li>ここにレイアウト用 XML を置くと </li></ul><ul><li>横向きのときのレイアウトが… </li></ul>
  34. 34. レイアウト (3) <ul><li>こういう表がありまして、こちらを自由に組み合わせて作ることができます。 </li></ul>small normal large xlarge 画面サイズ en-rUS fr-rFR etc 言語と地域 DoCoMo Softbank au mcc440-mnc10 mcc440-mnc20 mcc440-mnc70 MCC, MNC 備考 値 修飾子
  35. 35. レイアウト (3) v3 v4 … システムバージョン (API レベル ) ldpi mdpi hdpi nodpi 画面ピクセル密度 (dpi) night notnight ナイトモード car desk ドックモード port land 画面オリエンテーション long notlong 画面アスペクト
  36. 36. レイアウト (3) nonav dpad trackball wheel 主な非タッチナビゲーション方式 navexposed navhidden ナビゲーションキーの使用   nokeys qwerty 12key 主なテキスト入力方式 keysexposed keyssoft keyshidden キーボードの使用状態 notouch stylus finger タッチ画面タイプ
  37. 37. レイアウト (4) <ul><li>例 ) layout-xlarge-xhdpi-long-port-querty-v12 </li></ul><ul><li>特大スクリーン、 320dpi 、細長画面、 縦向き、 Qwerty キーボード搭載、 Android 3.1 の画面レイアウト </li></ul><ul><li>ルール : 項目がもっとも多くマッチしたものを採用 </li></ul>
  38. 38. レイアウト (5) <ul><li>android:layout_width 、 android:layout_heigth 等 </li></ul><ul><ul><li>wrap_content ( その UI 部品を表示するための最小のサイズ ) </li></ul></ul><ul><ul><li>fill_parent ( 親要素の幅 / 高さに合わせて最大限の領域を使うサイズ ) </li></ul></ul><ul><li>  を使う !! </li></ul><ul><li>android:padding ~ 、 android:textSize 等 </li></ul><ul><li>dp や sp </li></ul><ul><li>を使う !! </li></ul>
  39. 39. 画像リソースについて -- オートスケールと言う考え方 <ul><li>お約束のように res/drawable 下に画像ファイルを 置いておく </li></ul><ul><li>Android は、端末のピクセル密度に合わせて、 かってに 画像を拡大・縮小してサイズを調整してくれる。 </li></ul><ul><li>※ オートスケールにまかせると、画像がぼやけることがあります。 </li></ul><ul><li>例 ) Xperia( 初代 ) が出たばかりのころの    OpenWnn フリック </li></ul><ul><li>キートップの画像の hdpi 対応をサボったため、 キーボードが「 ゆうれいみたい 」とのお言葉を いただきました。 </li></ul>
  40. 40. 画像リソースについて -- プレスケール <ul><li>res / </li></ul><ul><li>drawable / </li></ul><ul><li>hogehoge.png </li></ul><ul><li>drawable -hdpi / </li></ul><ul><li>hogehoge.png </li></ul><ul><li>drawable -mdpi / </li></ul><ul><li>hogehoge.png </li></ul><ul><li>drawable -ldpi / </li></ul><ul><li>hogehoge.png </li></ul><ul><li>レイアウトの場合と同じ考え方で、画面の性質に合わせて 魔法のように 自動的に最適な画像が選ばれます。 </li></ul>
  41. 41. 画像リソースについて -- プレスケール <ul><li>Tips:   ( いくぶん受け売りです ) </li></ul><ul><ul><li>予想以上のスピードでハードウェアは進化します。 </li></ul></ul><ul><ul><li>アイコンとかを作るときは、最初から思いっきり大きなサイズで作っておこう !! </li></ul></ul><ul><ul><li>拡大は、エッジがぼやけてどうしようもなくなるけど、縮小は簡単だから。 </li></ul></ul>
  42. 42. <ul><li>場合によるけど、はまったら凄く便利な画像形式 </li></ul><ul><li>指定した部分だけが自動的に伸縮して周りに合わせてくれる。 </li></ul>変形しても型崩れしない画像 Nine Patch ( ナインパッチ ) 画像形式 変形しても それなりの デザインを 保っている これを
  43. 43. NinePatch フォーマット画像の作り方 <ul><li>上下左右の端 1 ライン分のところにエディタを使って黒いラインを引く </li></ul><ul><ul><li>上 と 左 の端に引いた黒の部分が、自動的に 引き伸 ばされるところ </li></ul></ul><ul><ul><li>下 と 右 の端に引いた黒の部分が、 コンテンツ領域 ( ラベル文字列が乗っかる部分 ) </li></ul></ul>
  44. 44. NinePatch フォーマット画像の作り方 <ul><li>あらかじめボタンのようなデザインの画像を png 形式で作っておく </li></ul><ul><li>android-sdk-windowstools 下にある draw9patch.bat をダブルクリック </li></ul><ul><li>エディタが立ち上がるので、 先の画像をドラッグ & ドロップ </li></ul>
  45. 45. NinePatch フォーマット画像の作り方 <ul><li>上下左右の端 1 ライン分のところにエディタを使って黒いラインを引く </li></ul><ul><ul><li>上 と 左 の端に引いた黒の部分が、自動的に 引き伸 ばされるところ </li></ul></ul><ul><ul><li>下 と 右 の端に引いた黒の部分が、 コンテンツ領域 ( ラベル文字列が乗っかる部分 ) </li></ul></ul>
  46. 46. ベクター形式画像リソース ShapeDrawable <ul><li>SVG のようなベクター形式画像 </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li>< shape xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:shape=&quot;rectangle&quot; > </li></ul><ul><li>< solid android:color=&quot;#FF666666&quot;/> </li></ul><ul><li>< corners android:radius=&quot;3dp&quot; /> </li></ul><ul><li></ shape > </li></ul><ul><li>res/drawable の下に ???.xml の名前で置く </li></ul>
  47. 47. ImageView 内の 画像データの自動リサイズ ScaleType について <ul><li>ImageView の ScaleType プロパティの使い方の例 </li></ul><ul><li>ImageView image = new ImageView(this); </li></ul><ul><li>image.setImageResource(R.drawable.hogehoge); </li></ul><ul><li>image. setScaleType ( ImageView.ScaleType . CENTER_CROP ); </li></ul><ul><li>※ 余白領域を含めた範囲内で元の画像の縦横比を維持ながら拡大し中央に寄せる </li></ul>
  48. 48. ImageView の ScaleType について 描画時に Matrix を使用 MATRIX 元の画像の縦横比を維持しつつ枠内ぎりぎりまで拡大し右下端に寄せる FIT_END 元の画像の縦横比を維持しつつ枠内ぎりぎりまで拡大し中央に寄せる FIT_CENTER 元の画像の縦横比を維持しつつ枠内ぎりぎりまで拡大し左上端に寄せる FIT_START 元の画像の縦横比を維持せず枠内ぎりぎりまで拡大 FIT_XY 余白領域を除いた範囲内で元の画像の縦横比を維持ながら拡大し中央に寄せる CENTER_INSIDE 余白領域を含めた範囲内で元の画像の縦横比を維持ながら拡大し中央に寄せる CENTER_CROP リサイズせず画像を中央に寄せる CENTER
  49. 49. Java のプログラムから 長さの指定を行うとき <ul><li>指定できる長さの単位は、下記のどちらか </li></ul><ul><ul><li>(1) px ( ピクセル ) </li></ul></ul><ul><ul><li>(2) dp 、 sp ( 密度非依存ピクセル ) </li></ul></ul><ul><li>アプリ内では、 (1) または (2) に統一される。 </li></ul><ul><li>  ※ AndroidManifest.xml android: anyDensity で指定   ( 後述 ) </li></ul>
  50. 50. px 指定の場合どうするのか? <ul><li>fugafuga_box.setTextSize( 12sp ) … なんてのは ムリ </li></ul><ul><li>こう書きます。 </li></ul><ul><li>DisplayMetrics metrics = new DisplayMetrics(); </li></ul><ul><li>getWindowManager() </li></ul><ul><li>.getDefaultDisplay(). getMetrics ( metrics ); </li></ul><ul><li>float density = metrics .density; </li></ul><ul><li>float textSize = density * 12.0f; </li></ul><ul><li>fugafuga_box.setTextSize( textSize ); </li></ul>
  51. 51. DisplayMetrics について 標準文字サイズを意識したスケーリングファクタ scaledDensity ( mdpi のとき 160 、 hdpi のとき 240 … ) 論理ピクセル密度 densityDpi ( 160dpi のスクリーンでは1、 240dpi スクリーンでは 1.5 … ) 論理ピクセル密度のスケーリングファクタ density 縦方向の実質ピクセル密度( DPI ) ydpi 横方向の実質ピクセル密度( DPI ) xdpi 画面の縦幅(ピクセル数) heightPixels 画面の横幅(ピクセル数) widthPixels
  52. 52. AndroidManifest.xml による 解像度対応の指定 <ul><li><supports-screens </li></ul><ul><li>android: smallScreens =&quot;true&quot; </li></ul><ul><li>android: normalScreens =&quot;true&quot; </li></ul><ul><li>android: largeScreens =&quot;true&quot; </li></ul><ul><li>android: anyDensity =&quot;true&quot;/> </li></ul><ul><li>~ Screens  アプリケーションがそのサイズの スクリーンに対応 するかどうかを示すもの </li></ul><ul><li>anyDensity   Java プログラムが 自らピクセル密度を意識 して位置や長さを計算しているかどうかを示すもの </li></ul><ul><ul><li>true のときピクセル密度を意識している。だから API の引数は 「 px 」 単位 </li></ul></ul><ul><ul><li>false のときピクセル密度を意識していない。 API の引数は単位は 「 dp 」 で、 OS 側で自動的 に処理を行う。 </li></ul></ul>
  53. 53. AVD -- いつものやつ (Android Virtual Device) で画面をテストする <ul><li>起動 : Eclipse の Window メニュー⇒ Android SDK and ADV Manger </li></ul><ul><li>(1) 画面サイズ の指定 -- 「 Skin 」項目で指定 </li></ul><ul><li>Built-in:    QVGA (240 x 320) </li></ul><ul><li>   HVGA (320 x 480) </li></ul><ul><li>   WVGA (480 x 854) … 他 </li></ul><ul><li>または、 </li></ul><ul><li>Resolution: 横ピクセル数、縦ピクセル数を入力 </li></ul><ul><li>(2) 画面密度 の指定 </li></ul><ul><li>Hardware 項目で Property リストに下記の項目を追加 </li></ul><ul><li>Abstructed LCD density </li></ul><ul><li>value に 160 とか 240 とかの値を設定する </li></ul><ul><li>(3) ついでに、 OS バージョン の指定も </li></ul><ul><li>(4) 名前を付けて、 Generate する。 </li></ul>
  54. 54. AVD で指定できるハードウェア特性 <ul><li>入力系 </li></ul><ul><ul><li>タッチスクリーン、トラックボール、キーボード、 Dpad </li></ul></ul><ul><li>センサー等 </li></ul><ul><ul><li>カメラ、 GPS 、加速度計 </li></ul></ul><ul><li>オーディオ </li></ul><ul><ul><li>オーディオ録音、オーディオ再生 </li></ul></ul><ul><li>その他 </li></ul><ul><ul><li>GSM モデム、 SD カード、バッテリ </li></ul></ul><ul><li>サイズの指定 </li></ul><ul><ul><li>デバイス RAM サイズ、キャッシュパーティション サイズ </li></ul></ul><ul><ul><li>カメラの水平最大ピクセル、カメラの垂直最大ピクセル </li></ul></ul><ul><li>上記全て、 Hardware 項目で Property リストに項目を追加して指定 </li></ul>
  55. 55. AVD でテスト <ul><li>画面関連機能 </li></ul><ul><ul><li>エミュレータ画面が大きすぎる場合、 Launch Options の Scale display to real size で指定する </li></ul></ul><ul><ul><li>Screen Size(in) と Monitor dpi を設定 </li></ul></ul><ul><ul><li>Ctl + F12 -- 画面を横に </li></ul></ul><ul><li>入出力関連 </li></ul><ul><ul><li>F6 トラックボールモードのトグル </li></ul></ul><ul><ul><li>etc etc </li></ul></ul>
  56. 56. OpenWnn ではどうやっているのか? <ul><li>■ お約束の AndroidManifest.xml </li></ul><ul><li><supports-screens </li></ul><ul><li>android:smallScreens=&quot;true&quot; </li></ul><ul><li>android:normalScreens=&quot;true&quot; </li></ul><ul><li>android:largeScreens=&quot;true&quot; </li></ul><ul><li>android:anyDensity=&quot;true&quot;/> </li></ul>
  57. 57. OpenWnn ではどうやっているのか? <ul><li>■ drawable について </li></ul><ul><li>res / </li></ul><ul><li>drawable / </li></ul><ul><li>drawable-hdpi / </li></ul><ul><li>キートップデザイン等、オートスケールでごまかせないものは、それぞれ用意 </li></ul><ul><li>絵文字に関しては drawable のみ </li></ul><ul><li>キーの部分は、 9-patch 画像です。 </li></ul>
  58. 58. OpenWnn ではどうやっているのか? <ul><li>■ 画面向きの判定 </li></ul><ul><li>public void onConfigurationChanged (Configuration config ) { </li></ul><ul><li>int displayOrientation = </li></ul><ul><li> ( config . orientation == Configuration.ORIENTATION_LANDSCAPE) ? </li></ul><ul><li>DefaultSoftKeyboard.LANDSCAPE : DefaultSoftKeyboard.PORTRAIT; </li></ul><ul><li>} </li></ul><ul><li>この後、要するに LayoutInflater を使って、縦向き / 横向きのキーボードレイアウトをロードしている。 </li></ul>
  59. 59. OpenWnn ではどうやっているのか? <ul><li>■ ハードウェアキーを使用しているかどうかの判定 </li></ul><ul><li>public void onConfigurationChanged (Configuration config) { </li></ul><ul><li>int hiddenState = config . hardKeyboardHidden ; </li></ul><ul><li>... </li></ul><ul><li>ハードウェアキー使用中は、ソフトウェアキーボードはうざいので隠します。 </li></ul><ul><li>if (!mHardKeyboardHidden) { </li></ul><ul><li>mMainView. removeView (mKeyboardView); </li></ul><ul><li>} </li></ul>
  60. 60. OpenWnn フリック入力対応版 ではどうやったのか? <ul><li>---  バグ減らしのちょっとしたコツ </li></ul><ul><li>■ AndroidManifest.xml </li></ul><ul><li>API Level は、 Android1.5 以上対応ということで、 </li></ul><ul><li><uses-sdk android:minSdkVersion=&quot;3&quot; /> </li></ul><ul><li>■ Project Build Target </li></ul><ul><li>プロジェクトのプロパティ⇒ Android⇒Project Build Target で </li></ul><ul><li>新しいコードを追加したら、 Project Build Target を色々変えて試してみる。 </li></ul><ul><li>OpenWnn フリックの場合、現在のところ Android 2.3.1 </li></ul>
  61. 61. OpenWnn フリック入力対応版の企画~製品開発までの流れ <ul><li>あらかじめ言っておきますが、 うちの製品開発プロセスでは わりと異例 の方です。 </li></ul><ul><li>■ 製品企画 1 </li></ul><ul><li>嫁 : 「旅行に行くの~  Google Map で地図が見れたらとっても便利そう」 </li></ul><ul><li>俺 : 「じゃ Google 携帯にすれば?」 </li></ul><ul><li>国内初の Android 携帯 HT-03A 購入決定 まるで、テレビ CM のお約束のような流れ </li></ul>
  62. 62. OpenWnn フリック入力対応版の 企画~製品開発までの流れ <ul><li>■ 製品企画 2 </li></ul><ul><li>しばらく経ってから </li></ul><ul><li>嫁 : 「メール打つとき、この日本語の入力が xxxx 」 とおっしゃられたわけです。 何度も。 </li></ul><ul><li>俺 : 「 Google 携帯にすれば」と言った手前、 何とかしなきゃ いけない状態だった。 立場上。 </li></ul>
  63. 63. OpenWnn フリック入力対応版の 企画~製品開発までの流れ <ul><li>■ 製品企画 3 </li></ul><ul><li>で、まったくもってたまたま、 Android のソースコードをダウンロード。 そこに OpenWnn のソースがあった。 </li></ul><ul><li>HT-03A の日本語 IME イコール OpenWnn のことだと思い込んでいた俺は、「 改造しちゃえ 」と思った。 </li></ul><ul><li>以上 </li></ul>
  64. 64. OpenWnn フリック入力対応版の 企画~製品開発までの流れ <ul><li>■ 製品開発はもっと簡単 </li></ul><ul><li>その週、お客様との飲み会があって Android を見せびらかした俺 </li></ul><ul><li>客 : 「ほー これが TV CM でやってる あれ ですか !! 」 </li></ul><ul><li>俺 : 「ほらほらー  こんなことも でますよ~」 </li></ul><ul><li>俺 : 「早々に何らかの 自社製品を公開 するつもりです~ 」 </li></ul>
  65. 65. OpenWnn フリック入力対応版の 企画~製品開発までの流れ <ul><li>■ 製品開発はもっと簡単 </li></ul><ul><li>で、家に帰って 酔った勢い のまま OpenWnn を改造、そのままマーケットに公開。 </li></ul><ul><li>マーケット公開 直前に アプリのアイコンを アップロードしなければいけないことに 気づいて 、 15 分ほどで デッチあげ ました。 ※ そのまま現在のアイコンとなりました。 </li></ul>
  66. 66. OpenWnn フリック入力対応版の企画~製品開発までの流れ <ul><li>■ フィードバック&バージョンアップ </li></ul><ul><li>公開して 2 時間後には、フィードバックのメールをいただきました。 「 2ch をご覧になってください 」 </li></ul><ul><li>招待をうけて 2ch の掲示板 にいくと 何やら盛り上がって いて、掲示板が 要望リスト状態 になっていた。 </li></ul><ul><li>それを見てバージョンアップ ⇒ さらに盛り上がった   という経緯 </li></ul>
  67. 67. 引用させていただきました <ul><li>梅田 郁 様 ソフトウェア技術ドキュメントを勝手に翻訳 </li></ul><ul><li>あんざいゆき 様 Y.A.M の 雑記帳 </li></ul><ul><li>有山 圭二 様 解像度の異なる端末に対応する </li></ul><ul><li>その他、高度な技術情報を惜しみなく ご提供いただいた方々に 深い感謝の意を表します。 </li></ul>
  68. 68. Fin <ul><li>ご聴取いただき、誠に有難うございます。 </li></ul><ul><li>また、どこかでお会いしましょう。 </li></ul>

×