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);
    }
}

Смотрите также

Другие вопросы по тегам