4. 解像度の違いに起因する問題
iOSアプリにおいては、画面のアスペクト比は3種類しかないため、それぞれのアスペクト比に最適化した画面を用意すること可能だ。
一方、Androidアプリにおいては、画面のアスペクト比のバリエーションが多岐にわたるため、それぞれのアスペクト比に最適化した画面レイアウトを用意するのは困難だ。幸い、Androidアプリには画面構成を柔軟に制御できる仕組みとしてLayoutが用意されており、動的にコンポーネントを配置することができる。これは、iOSアプリにはない便利な機能だ※。
※ iOS6以上に限定すればAutoLayout機能がある。
ただこれだけではやはり不十分で、Layoutによりコンポーネントの配置を決めることはできるが、コンポーネント自体のサイズを変更をするようなことはできない。各端末にあわせた最適な表示を実現するには、やはりそれぞれのサイズ・アスペクト比にあわせてリソースを準備しておくしかないだろう。
もう一点、Androidの画面レイアウトを構成する際の注意点を紹介する。画面コンポーネントを配置する際にレイアウトのネストを深くすると表示が遅くなる、という問題である※。
※ iOSでも同様の事象はあるが描画アーキテクチャが秀逸であるためそこまで問題とはならない。
画面コンポーネントがネストされたレイアウトとして構成されている場合に、ネストの末端のコンポーネントの再描画に伴い、その上位にある全てのコンポーネントに対してLayoutの再計算、および再描画が行われる。対策として、末端のコンポートネント再描画をそのコンポーネントに限定させることでこの処理を省くことができる。例えば以下のような独自コンポーネントを用意して対応している。
{{{
// 上位コンポーネントの再描画をおこなわいTextViewクラス
public class CustomizedTextView extends android.widget.TextView {
@Override
public void requestLayout() {
if (再描画したくない場合を判定) {
return;
}
super.requestLayout();
}
}}}