Status Update
Comments
ha...@google.com <ha...@google.com>
ja...@squareup.com <ja...@squareup.com> #2
Same issue, different reason. We also want to be able to vertically center some text within the ascent < --> baseline region. Having access to ascent/descent would let us appropriately set an Offset
on Canvas { drawText () "}
ha...@google.com <ha...@google.com> #3
Ascent and Descent values in the context of text layout are slightly different from what they signify in font metrics.
Top, ascent, descent, bottom values anchored around (baseline = 0) can be calculated for a Paint object because it only has a single configuration for textSize, typeface, font settings, etc. that affect font metrics. However, a text layout (vertically placed lines of text) may have varying range of text sizes, typefaces, etc on a single line. Hence, it can be conceptually impossible to say what is ascent or descent of a text line since these values can fluctuate between individual characters on a line.
Ascent and Descent are still provided by android.text.Layout
, android.text.StaticLayout
but in a different way. Ascent refers to the difference between top and baseline, while Descent refers to the difference between bottom and baseline. You can actually see how these values are calculated here
If you want to have access to getLineAscent and getLineDescent from StaticLayout(Paragraph in Compose), you can easily calculate those values via
getLineDescent(x) = getLineBottom(x) - getLineBaseline(x)
getLineAscent(x) = getLineTop(x) - getLineBaseline(x)
On the other hand, we can discuss the practicality of exposing some of these values (AndroidTextPaint#fontMetrics
in AndroidParagraph
(both are internal). It only makes sense to read those fontMetrics if;
- Your text layout contains only a single paragraph
- That paragraph has no spans that affect font metrics
ap...@google.com <ap...@google.com> #4
Branch: androidx-main
commit c652a36a7fd43af14820497b1efa3215b7424f8d
Author: Anastasia Soboleva <soboleva@google.com>
Date: Fri Feb 09 12:08:13 2024
Add getBaseline to TextLayoutResult
Fixes: 324417208
Bug: 237428541
Test: added new tests to cover the functionality
Relnote: "The TextLayoutResult now exposes the `getLineBaseline(lineIndex)` method. This allows to read the baseline of an arbitrary line of the text in addition to existing convenience properties `firstBaseline` and `lastBaseline`"
Change-Id: Ide4e848470681364cdf7e141154d8fe5b7641eb9
M compose/ui/ui-text/api/current.ignore
M compose/ui/ui-text/api/current.txt
M compose/ui/ui-text/api/restricted_current.ignore
M compose/ui/ui-text/api/restricted_current.txt
M compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/MultiParagraphIntegrationTest.kt
M compose/ui/ui-text/src/androidInstrumentedTest/kotlin/androidx/compose/ui/text/ParagraphIntegrationTest.kt
M compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/AndroidParagraph.android.kt
M compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/Paragraph.android.kt
M compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
M compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/Paragraph.kt
M compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextLayoutResult.kt
M compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
M compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/Paragraph.skiko.kt
M compose/ui/ui-text/src/skikoMain/kotlin/androidx/compose/ui/text/SkiaParagraph.skiko.kt
Description
It is currently difficult to draw custom spans for
Text()
becauseTextLayoutResult
does not expose any APIs for accurately reading line bounds. Considering thatAndroidParagraph
already has APIs such asgetLineAscent()
,getLineBaseline()
andgetLineDescent()
, can they be bubbled up toTextLayoutResult
?Having access to
getTopPadding()
andgetBottomPadding()
fromandroid.text.Layout
would also be helpful.AFAIK, there is currently no workaround for reading these values. Inspecting font metrics would have been one option, but that is not available either ( https://issuetracker.google.com/issues/173648606 ).