Удалите лишнее пространство перед первой буквой текста, чтобы оно могло быть правильно выровнено влево

У меня есть несколько точных TextView с выровненными по вертикали (одинаковый край слева, одинаковый отступ слева, то же положение слева). Они могут иметь разный размер текста, а также текст может начинаться с другого письма. Проблема в том, что хотя TextView s выровнены влево, текст в них отсутствует. Можно ли это достичь? Чтобы удалить / увеличить дополнительное пространство перед каждой первой буквой? Или я должен искать какой-то конкретный шрифт?

На рисунках ниже показана ситуация. Есть три TextView s, выровненные слева, но каждая буква начинается с другой точки. S и m имеют одинаковый размер, но не выровнены. I значительно меньше, а разрыв намного больше.

Что я вижу:
фактический

Что я хочу:
Ожидаемый результат (вручную выровнен)

Код примера:

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="m" android:textColor="#88FF0000" android:textSize="250dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="s" android:textColor="#8800FF00" android:textSize="250dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="220dp" android:text="i" android:textColor="#880000FF" android:textSize="25dp" /> </RelativeLayout> 

Хотя этот вопрос старый, я просто столкнулся с одной проблемой и нашел решение следующим образом, возможно, это может помочь кому-то другому:

Создайте подкласс TextView и переопределите его метод onDraw() следующим образом:

 // bounds field to avoid allocations in onDraw() Rect bounds = new Rect(); @Override protected void onDraw(Canvas canvas) { getPaint().getTextBounds(getText().toString(), 0, getText().length(), bounds); canvas.translate(-bounds.left, 0); super.onDraw(canvas); } 

Предостережение . Хотя я заметил, что границы текста имеют левое значение, соответствующее количеству пустых пикселей перед первой буквой, и соответствует документации Paint#getTextBounds() которая заявляет, что она возвращает

Самый маленький прямоугольник, который охватывает все символы, с подразумеваемым началом в (0,0),

Таким образом, левое значение – это то, где начинается фактический текст, это исправление может не работать для всех шрифтов или конфигураций.

Следует также отметить, что это простое решение для выравнивания по левому краю текста с одной строкой; Многострочный или прокрученный текст будет нуждаться в дополнительных корректировках или может вообще не работать с этим.