/**
* @param view TextView
* @param maxLines 最大行数
* @param where 省略する箇所
*/
public static void setMultilineEllipsize(TextView view, int maxLines, TruncateAt where) {
if (maxLines >= view.getLineCount()) {
// ellipsizeする必要無し
return;
}
float avail = 0.0f;
for (int i = 0; i < maxLines; i++) {
avail += view.getLayout().getLineMax(i);
}
CharSequence ellipsizedText = TextUtils.ellipsize(
view.getText(), view.getPaint(), avail, where);
view.setText(ellipsizedText);
}
TextUtils#ellipsize()はavailで指定された範囲に文字列をいい具合にカットしてくれるAPIです。availはLayout#getLineMax()で指定行の描画範囲が取得できるので、それを最大行(maxLines)までの範囲を足してもとめます。
使用例
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = (TextView) findViewById(android.R.id.text1);
tv.setText(R.string.attack_on_titan);
tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
setMultilineEllipsize(tv, 3, TruncateAt.END);
}
});
}
TextView#getLayout()などは描画後じゃないと取得できないので、OnGlobalLayoutListenerを使います。activity_main.xml
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
TextViewにellipsize,maxLinesは設定しないでください。実行
- Ellipsize=START, MaxLines=1
- Ellipsize=MIDDLE, MaxLines=3
- Ellipsize=END, MaxLines=5
- Ellipsize=END, MaxLines=20




0 件のコメント:
コメントを投稿