kojiko-android’s blog

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

フォントサイズを自動調整するテキストビュー

テキストビューに文字列を表示させる際、
文字列がテキストビューの縦・横幅にぴったり納まるように
フォントサイズを自動調整するテキストビューです。

こちらのサイトを参考にさせていただきました!
思った通りのレイアウトができ、本当に助かりました。ありがとうございます!
monakap.hatenablog.com

テキストビューを継承したクラスです
public class AutoResizeTextView extends TextView {

    private  final float MIN_TEXT_SIZE = 10f;

    public AutoResizeTextView(Context context) {
        super(context);
    }

    public AutoResizeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        resize();
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        resize();
    }

    private void resize() {

        Paint paint = new Paint();

        int viewWidth = this.getWidth();
        int viewHeight = this.getHeight();

        //    適当に大きめの数値からスタート
        float textSize = 300f;

        paint.setTextSize(textSize);

        Paint.FontMetrics fm = paint.getFontMetrics();
        float textHeight = (float)(Math.abs(fm.top)) + (Math.abs(fm.descent));

        float textWidth = paint.measureText(this.getText().toString());
        while (viewWidth < textWidth | viewHeight < textHeight){
            if (MIN_TEXT_SIZE >= textSize){
                textSize = MIN_TEXT_SIZE;
                break;
            }

            textSize--;

            paint.setTextSize(textSize);

            fm = paint.getFontMetrics();
            textHeight = (float)(Math.abs(fm.top)) + (Math.abs(fm.descent));
            textWidth = paint.measureText(this.getText().toString());
        }
        setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
    }

}


前途のサイトに各処理の詳細が掲載されています。
非常にわかりやすいのでぜひご覧ください。


また、宣伝みたいになってしまいますが、
このテキストビューに、タップした時に色を暗くする機能
ボタンをタップした時に動的に色を変える方法 - kojiko-android’s blog
を持たせ、ボタンとして活用した電卓アプリを作りました。
全てのボタン、メインディスプレイ等を全部を、こちらのカスタムテキストビューを継承して使っています。
それぞれ、サイズ調整の際に、サイズを1づつデクリメントしているので、
やや重くなってしまいましたが、
端末の画面サイズが変わっても狙い通りのレイアウトになるので、
とても重宝しています。
よろしかったらお試しください!
play.google.com

今後の課題は、ボタンらしい影を追加すること。
大変そう・・・笑