2012/11/07

【7日目】Tabletかどうかの判定

この記事は、@astronaughts が始められた「Titanium mobile “early” Advent Calendar 2012」向けに書いています。11月1日 ~ 30日まで毎日誰かがTitanium Mobileについての記事を書いていくというイベントです。

 ■Tabletかどうかの判定 
マルチデバイスをターゲットにしたアプリを制作する場合に、対象の端末がタブレットかどうかを判定したい場合があると思います。 Titanium Studioで作成されるテンプレートだと、以下のような素敵コードでタブレットかどうかを判定してくれます。
//considering tablet to have one dimension over 900px - this is imperfect, so you should feel free to decide
//yourself what you consider a tablet form factor for android
var isTablet = osname === 'ipad' || (osname === 'android' && (width > 899 || height > 899));
iOSの場合はこれでも問題無いでしょう。Ti.Platform.osnameが'ipad'を返せば、それは間違い無くタブレットなのでしょうから。

でも、Androidの場合はどうでしょう?上記コードだと縦もしくは横の解像度が900ドット以上だとタブレットと判定するようです。 これそのまま使うと、いまなら多くのAndroid端末がタブレットと判定されてしまうでしょう。ましてやauの冬モデルで発表されたHTC J butterflyなんかは5inchサイズながら1920x1080のフルHD解像度です。Nexus10を別にすれば、その辺のタブレットも真っ青な解像度ですよ。

コメントにもあるようにこの判定方法は完璧とはほど遠く(それにしても"feel free to decide yourself"とは何とお気楽な...)、このような解像度で判定するやり方は進化の早いスマートデバイス業界にはとても通用しそうもありません。 

では、どのようにしてタブレットかどうかを判定すれば良いのでしょうか?タブレットをタブレットとして我々が認識するのはやはりその画面サイズだと思われます。Ti.Platform.DisplayCaps以下にスクリーンサイズを得るメソッドが無くても臆することはありません。自分で計算して求めればいいのです。

HTC J butterflyがスマホで、Nexus7がタブレットとして世の中に認知されているなら、5.0 - 7.0inchの間にタブレットかどうかの判断ポイントがあるようです。以下の例では6.5inchサイズより大きければタブレットと判定するようにしてます。
function isTablet() {
  // xdpi, ydpiが未定義のプラットフォームもあるのでその場合はdpiを使用
  var xdpi = Ti.Platform.displayCaps.xdpi == undefined ? Ti.Platform.displayCaps.dpi : Ti.Platform.displayCaps.xdpi;
  var ydpi = Ti.Platform.displayCaps.ydpi == undefined ? Ti.Platform.displayCaps.dpi : Ti.Platform.displayCaps.ydpi;
  var disp_size = Math.sqrt(
    Math.pow(Ti.Platform.displayCaps.platformWidth/xdpi, 2) +
    Math.pow(Ti.Platform.displayCaps.platformHeight/ydpi, 2)
  );
  return (disp_size > 6.5 ? true : false); // 6.5インチ以上ならタブレット
}
え?いまだとスマホとタブレットの間にphabletっていうジャンルがあるって?
知らんがな...

ってことで、明日は@masapla さんです。よろしくお願いします。

Code strong,

0 件のコメント:

コメントを投稿