Androidの文字サイズをディスプレイサイズに応じて自動的に調整する

1つのレイアウトしか用意しないアプリだと、
タブレットで表示すると画面サイズに対して文字が小さく表示されてしまいます。

タブレットではスマホに比べて目から画面への距離も遠くなる傾向にあるため、
文字も大きく表示したいところです。

解像度に応じてレイアウトを変更してもいいのですが、そんなにこだわっているわけでもなく、
「大きい画面なら文字も大きく読みやすくしてほしい」という要件を満たすだけなら、
レイアウトを2つ用意するのはメンテナンスコストがかかってしまいます。

また、画面サイズも様々なものがあり、
10インチ基準で文字サイズを設定すると7インチで大きくなりすぎてしまったりして、
それに対応しようとしてさらにレイアウトを追加しようものなら大変です。

そこで、画面のレイアウトを4インチ基準で作成し、
表示している端末の画面サイズが4インチより大きかった場合に画面の文字サイズを
画面サイズに応じて大きくする処理を作成しました。

画面のインチサイズの取得処理はこちらからお借りしました。

    /**
     * 文字サイズをレイアウトサイズに応じて変更します。
     * @param layoutid 大元のレイアウトのID(ViewGroupであること)
     */
    private void setTextSizeByInch(int layoutid) {
        // ディスプレイ情報を取得する
        final DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        // ピクセル数(width, height)を取得する
        final int widthPx = metrics.widthPixels;
        final int heightPx = metrics.heightPixels;
        // dpi (xdpi, ydpi) を取得する
        final float xdpi = metrics.xdpi;
        final float ydpi = metrics.ydpi;
        // インチ(width, height) を計算する
        final float widthIn = widthPx / xdpi;
        final float heightIn = heightPx / ydpi;
        // 画面サイズ(インチ)を計算する
        final double in = Math.sqrt(widthIn * widthIn + heightIn * heightIn);
        // 4インチ以上は比率に応じて文字を拡大
        if (in > 4) {
            // 親のレイアウトを取得
            ViewGroup parent = (ViewGroup)findViewById(layoutid);
            setTextSizes(parent, in / 4);
        }
    }

    /**
     * 親のレイアウトに設定されている子Viewの文字を画面サイズに応じて倍加します。
     */
    private void setTextSizes(ViewGroup parent, double multiple) {
        for(int i = 0; i < parent.getChildCount(); i++) {
            View view = parent.getChildAt(i);
            if (view instanceof ViewGroup) {
                setTextSizes((ViewGroup)view, multiple);
            } else if (view instanceof TextView) {
                TextView targetView = (TextView) view;
                targetView.setTextSize(TypedValue.COMPLEX_UNIT_PX, (int)(targetView.getTextSize() * multiple));
            }
        }
    }

この処理をonCreateとかに挟めばOKです。
変更するのはTextViewの文字サイズだけで、ImageViewなどのwidthなんかは同じような方法で変更する必要があります。

また、単に掛け算でサイズを変えるお粗末仕様なので、厳密なレイアウトを要求されるようなところだと使えないですねー。

コメント

タイトルとURLをコピーしました