Android Layout: значение getLineBaseline, getLineDescent, getLineAscent, getLineBottom, getLineTop
Документация для следующих методов Layout
(в том числе StaticLayout
, DynamicLayout
, а также BoringLayout
) очень скудны.
getLineBaseline(int line)
getLineDescent(int line)
getLineAscent(int line)
getLineBottom(int line)
getLineTop(int line)
Какие именно числа возвращают эти методы? Являются ли они нормальными значениями метрик шрифта или они расположены на макете?
Я сделал тестовый проект, чтобы выяснить это, поэтому я публикую свой ответ под стилем вопросов и ответов.
1 ответ
Ранее я описывал значения вершины, подъема, базовой линии, спуска, низа и лидирования в Android FontMetrics.
Поскольку Layout
методы getLineBaseline
, getLineDescent
, getLineAscent
, getLineBottom
, а также getLineTop
звучит так похоже на FontMetrics
имена, их легко спутать. Тем не менее, они сообщают о двух разных типах вещей:
Эти методы возвращают свои вертикальные позиции на макете, который отличается для каждой строки.
getLineBaseline
getLineBottom
getLineTop
Однако следующие два метода возвращают значение для конкретной строки, в которой они находятся, независимо от того, где строка находится в макете. Таким образом, если только нет специальных интервалов, которые влияют на размер, они будут одинаковыми для каждой строки.
getLineAscent
getLineDescent
демонстрация
Я сделал простой проект, чтобы продемонстрировать, что информация выше. Есть шесть строк текста в EditText
, Нажатие на кнопку записывает информацию для каждой строки.
Результаты
Вот зарегистрированный результат:
line 0 baseline: 67
line 1 baseline: 140
line 2 baseline: 213
line 3 baseline: 286
line 4 baseline: 359
line 5 baseline: 432
line 0 descent: 15
line 1 descent: 15
line 2 descent: 15
line 3 descent: 15
line 4 descent: 15
line 5 descent: 18
line 0 ascent: -67
line 1 ascent: -58
line 2 ascent: -58
line 3 ascent: -58
line 4 ascent: -58
line 5 ascent: -58
line 0 top: 0
line 1 top: 82
line 2 top: 155
line 3 top: 228
line 4 top: 301
line 5 top: 374
line 0 bottom: 82
line 1 bottom: 155
line 2 bottom: 228
line 3 bottom: 301
line 4 bottom: 374
line 5 bottom: 450
FontMetrics top: -67
FontMetrics bottom: 18
FontMetrics ascent: -58
FontMetrics descent: 15
Как вы можете видеть, верхняя, нижняя и базовая линии накапливаются в зависимости от линии. Подъем и спуск в основном остаются одинаковыми для каждой линии. Восхождение равно FontMetrics.ascent
для всех строк, кроме первой, где она равна FontMetrics.top
, И спуск равен FontMetrics.descent
для всех строк, кроме последней, где она равна FontMetrics.bottom
,
Таким образом, верх, низ, базовая линия, подъем и спуск для линии не должны рассматриваться как равные FontMetrics
значения с одинаковыми именами. На линии подъем - это расстояние от базовой линии до нижней части линии над ней. Спуск - это расстояние от базовой линии до вершины следующей линии.
Только в исходном коде top
а также descent
сохраняются для каждой строки. Другие значения рассчитываются из них:
- bottom = начало следующей строки
- базовая линия = низ - спуск
- подъем = верх - (низ - спуск)
Код проекта:
public class MainActivity extends AppCompatActivity {
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText);
}
public void buttonClick(View view) {
Layout layout = editText.getLayout();
for (int i = 0; i < layout.getLineCount(); i++) {
int baseline = layout.getLineBaseline(i);
Log.i("TAG", "line " + i + " baseline: " + baseline);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int descent = layout.getLineDescent(i);
Log.i("TAG", "line " + i + " descent: " + descent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int ascent = layout.getLineAscent(i);
Log.i("TAG", "line " + i + " ascent: " + ascent);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int top = layout.getLineTop(i);
Log.i("TAG", "line " + i + " top: " + top);
}
for (int i = 0; i < layout.getLineCount(); i++) {
int bottom = layout.getLineBottom(i);
Log.i("TAG", "line " + i + " bottom: " + bottom);
}
Paint.FontMetricsInt fm = editText.getLayout().getPaint().getFontMetricsInt();
Log.i("TAG", "fm top: " + fm.top);
Log.i("TAG", "fm bottom: " + fm.bottom);
Log.i("TAG", "fm ascent: " + fm.ascent);
Log.i("TAG", "fm descent: " + fm.descent);
}
}
Смотрите также
Layout
документацияLayout.java
исходный кодStaticLayout.java
исходный код