Как установить ширину шрифта в текстовом виде Android?
Я разрабатываю приложение, которое отображает информацию, такую как ascii arts, которые очень чувствительны к ширине шрифта. Я использовал моноширинный шрифт, но он не работает хорошо, потому что в информации есть широкие символы (например, китайские и японские символы), а текст не делает широкие символы ровно в два раза шире, чем обычные символы. Поэтому я пытаюсь проверить, можно ли изменить ширину шрифтов в текстовом виде или если есть лучший способ решить эту проблему? Является ли установка другого моноширинного шрифта в мое приложение хорошей идеей? Любой вход очень приветствуется. Спасибо.
Кевин
Ответы
Ответ 1
Вы можете попробовать
textView.setTextScaleX(1.5f);
textView.setTextSize(20);
textView.setTypeface(Typeface.MONOSPACE); //all characters the same width
С помощью этих трех методов я надеюсь, что вы можете установить шрифт на желаемый внешний вид.
Ответ 2
Этот вопрос слишком старый, но у меня возникла похожая проблема, и в итоге я нашел хорошее решение.
У меня есть шрифт, который не имеет моноширинного варианта. Мне нужно отобразить шестнадцатеричное значение в несколько строк в TextView
, но я не хочу использовать любой другой шрифт.
Документация Android гласит:
Интервалы - это мощные объекты разметки, которые можно использовать для стилизации текста на уровне символов или абзацев. Прикрепляя интервалы к текстовым объектам, вы можете изменять текст различными способами, в том числе добавлять цвет, делать текст кликабельным, масштабировать размер текста и рисовать текст по своему усмотрению. Spans также может изменять свойства TextPaint, рисовать на холсте и даже изменять текстовый макет.
Итак, я создаю собственную реализацию MonospaceSpan
которая является производной от ReplacementSpan
. Этот диапазон обнаруживает самый широкий символ данного текста и рисует другие с такой же шириной.
Вот результат:
![MonospaceSpan result]()
GitHub
MonospaceSpan.java
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.style.ReplacementSpan;
public class MonospaceSpan extends ReplacementSpan {
private boolean ignoreFullText;
public void setIgnoreFullText(boolean ignoreFullText) {
this.ignoreFullText = ignoreFullText;
}
private int getMaxCharWidth(@NonNull Paint paint, @NonNull CharSequence text, int start, int end, float[] widths) {
if (widths == null) {
widths = new float[end - start];
}
paint.getTextWidths(text, start, end, widths);
float max = 0;
for (float w : widths) {
if (max < w) {
max = w;
}
}
return Math.round(max);
}
@Override
public int getSize(@NonNull Paint paint, @NonNull CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
if (fm != null) {
paint.getFontMetricsInt(fm);
}
int count = end - start;
if (text.charAt(start) == '\n') {
count -= 1;
}
if (text.charAt(end - 1) == '\n') {
count -= 1;
}
if (count < 0) {
count = 0;
}
if (ignoreFullText) {
return getMaxCharWidth(paint, text, start, end, null) * count;
} else {
return getMaxCharWidth(paint, text, 0, text.length(), null) * count;
}
}
@Override
public void draw(@NonNull Canvas canvas, @NonNull CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
float[] widths = new float[end - start];
int max = getMaxCharWidth(paint, text, start, end, widths);
if (!ignoreFullText) {
max = getMaxCharWidth(paint, text, 0, text.length(), null);
}
for (int i = 0, n = end - start; i < n; ++i) {
float p = (max - widths[i]) / 2;
canvas.drawText(text, start + i, start + i + 1, x + max * i + p, y, paint);
}
}
}
Пример использования:
MainActivity.java
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.SpannableString;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String text = "Lorem ipsum\ndolor sit amet\n0123456789";
SpannableString textMono = new SpannableString(text);
textMono.setSpan(new MonospaceSpan(), 0, textMono.length(), 0);
TextView textView1 = findViewById(android.R.id.text1);
TextView textView2 = findViewById(android.R.id.text2);
textView1.setText(text);
textView2.setText(textMono);
}
}
разреш/макет/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:background="#fa0"
android:fontFamily="@font/fredoka_one" />
<TextView
android:id="@android:id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:background="#0af"
android:fontFamily="@font/fredoka_one" />
</LinearLayout>
Ответ 3
для тех, кто хочет установить моноширинный режим с использованием xml, попробуйте добавить 'android: typeface = "monospace"'
<TextView
android:id="@+id/tv_output"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:typeface="monospace" />
перед добавлением моноширин
![enter image description here]()
после добавления моноширина ![enter image description here]()