[Androidアプリ開発] フォントサイズ自動調整TextViewを作ってみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
今回は、フォントサイズが自動調整されるTextViewを作ってみました。
iOSでいう「UILabel」の「Autoshrink」で「Minimum...」を設定したときのようなものです。
もしかしたらこれを実現できるプロパティは存在していて、見落としてしまっただけかもしれませんが。。。
AutoshrinkTextView.java
package jp.classmethod.sampletextview;
import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.TextView;
public class AutoshrinkTextView extends TextView {
/** 最小のテキストサイズ。 */ private static final float MIN_TEXT_SIZE = 6.0f;
/** テキスト幅計測用のペイント。 */ private Paint mPaint = new Paint();
/** * コンストラクタ。 * * @param context * @param attrs */ public AutoshrinkTextView(Context context, AttributeSet attrs) { super(context, attrs); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec);
float measuredWidth = getMeasuredWidth(); if (measuredWidth > 0) { shrinkTextSize(); } }
/** * テキストサイズを縮小します。 */ private void shrinkTextSize() { // テキストサイズを取得します。 float tempTextSize = getTextSize();
// テキスト幅が入りきっていない場合は、入るまで繰り返します。
while (getMeasuredWidth() < getTextWidth(tempTextSize)) {
// テキストサイズを縮小します。
tempTextSize--;
if (tempTextSize <= MIN_TEXT_SIZE) {
// 最小テキストサイズより小さくなった場合は、最小テキストサイズをセットして終了します。
tempTextSize = MIN_TEXT_SIZE;
break;
}
}
// 調整した結果のテキストサイズをセットします。
setTextSize(TypedValue.COMPLEX_UNIT_PX, tempTextSize);
}
/**
* テキスト幅を取得します。
*
* @param text
* @param textSize
* @return
*/
float getTextWidth(float textSize) {
mPaint.setTextSize(textSize);
float textWidth = mPaint.measureText(getText().toString());
return textWidth;
}
}
[/java]
では、試してみます。サンプルのレイアウトはこちら。
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <jp.classmethod.sampletextview.AutoshrinkTextView android:id="@+id/autoshrinkTextView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="classmethod" android:textSize="30sp" /> <jp.classmethod.sampletextview.AutoshrinkTextView android:id="@+id/autoshrinkTextView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/autoshrinkTextView1" android:layout_marginTop="10dp" android:text="classmethod_classmethod_classmethod" android:textSize="30sp" /> <jp.classmethod.sampletextview.AutoshrinkTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/autoshrinkTextView2" android:layout_marginTop="10dp" android:text="classmethod_classmethod_classmethod_classmethod_classmethod" android:textSize="30sp" /> </RelativeLayout>
実行結果がこちら。
動きました。
ただし、これは1行のときにしか対応していません。複数行対応版はまた今度。
ではでは。