kojiko-android’s blog

開発中にハマった時の解決策や、忘れがちなことを残しておきます。

テキストサイズをButtonに収まるように調整する

テキストサイズをButtonに収まるように調整するためのメソッドです。
TextViewでテキストサイズを自動調整する方法は検索すると多数出てきます。
こちらを参考にさせていただきました。ありがとうございます。
TextViewのフォントサイズを自動調整する。 - monaka android memo

今回はボタンのように、テキストをあまり変えることがないViewでテキストサイズを調整する場合に便利なメソッドを定義しました。

private float resize(Button button) {

        final float MIN_TEXT_SIZE = 10f;//最小サイズを決める

        String text = button.getText().toString();
        int padding = button.getPaddingLeft();//
        Paint paint = new Paint();

        int viewWidth = button.getWidth() - (padding * 2);//Viewのコンテンツ領域を取得
        int viewHeight = button.getHeight() - (padding * 2);//パディングは左右同じとして
        
        float textSize = 200f;//テキストサイズの初期値を適当に決める

        paint.setTextSize(textSize);//テキストサイズをセット

        Paint.FontMetrics fm = paint.getFontMetrics();
        float textHeight = (Math.abs(fm.top)) + (Math.abs(fm.descent));//テキストの高さを取得

        float textWidth = paint.measureText(text);//テキストの幅を取得

        while (viewWidth < textWidth || viewHeight < textHeight) {//ボタンに収まるまでループ

            if (MIN_TEXT_SIZE >= textSize) {//最小サイズを下回ったら最小サイズに設定
                textSize = MIN_TEXT_SIZE;

                break;
            }

            textSize -= 8f;//テキストサイズをデクリメント(間隔は適当に)

            paint.setTextSize(textSize);

            fm = paint.getFontMetrics();
            textHeight = (Math.abs(fm.top)) + (Math.abs(fm.descent));
            textWidth = paint.measureText(text);//テキストの縦横サイズを再取得
        }

        button.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize);//収まるサイズに設定

        return textSize;

    }

ButtonのプロパティのSingleLineにチェックを入れて下さい。
引数にButtonを渡すと、Buttonのテキストを取得し、サイズを調整します。
調整したサイズをリターンするので、他の同じようなButtonのテキストサイズを調整するには、その値を使えます。
(例:電卓の数字キーなど)
オンクリエイト内等で実行すると、Viewのサイズが0なので文字が小さくなってしまいます。
Viewのサイズと、文字列がわかった時点で実行してください。

ご注意。独自フォントを設定していると、フォントによってはテキストサイズがはみ出してしまったり、
期待通りの結果にならないことがあるようです。
その場合の解決策は、まだ自分で試していないので、確認したら追記します。