Merge "Change textAnimator to modify weight in variable fonts" into tm-qpr-dev
This commit is contained in:
@@ -23,6 +23,7 @@ import android.animation.ValueAnimator
|
|||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.graphics.fonts.Font
|
import android.graphics.fonts.Font
|
||||||
|
import android.graphics.fonts.FontVariationAxis
|
||||||
import android.text.Layout
|
import android.text.Layout
|
||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
|
|
||||||
@@ -215,13 +216,40 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) {
|
|||||||
textInterpolator.targetPaint.textSize = textSize
|
textInterpolator.targetPaint.textSize = textSize
|
||||||
}
|
}
|
||||||
if (weight >= 0) {
|
if (weight >= 0) {
|
||||||
// Paint#setFontVariationSettings creates Typeface instance from scratch. To reduce the
|
val fontVariationArray =
|
||||||
// memory impact, cache the typeface result.
|
FontVariationAxis.fromFontVariationSettings(
|
||||||
textInterpolator.targetPaint.typeface =
|
textInterpolator.targetPaint.fontVariationSettings
|
||||||
typefaceCache.getOrElse(weight) {
|
)
|
||||||
textInterpolator.targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight"
|
if (fontVariationArray.isNullOrEmpty()) {
|
||||||
textInterpolator.targetPaint.typeface
|
textInterpolator.targetPaint.typeface =
|
||||||
|
typefaceCache.getOrElse(weight) {
|
||||||
|
textInterpolator.targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight"
|
||||||
|
textInterpolator.targetPaint.typeface
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val idx = fontVariationArray.indexOfFirst { it.tag == "$TAG_WGHT" }
|
||||||
|
if (idx == -1) {
|
||||||
|
val updatedFontVariation =
|
||||||
|
textInterpolator.targetPaint.fontVariationSettings + ",'$TAG_WGHT' $weight"
|
||||||
|
textInterpolator.targetPaint.typeface =
|
||||||
|
typefaceCache.getOrElse(weight) {
|
||||||
|
textInterpolator.targetPaint.fontVariationSettings =
|
||||||
|
updatedFontVariation
|
||||||
|
textInterpolator.targetPaint.typeface
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fontVariationArray[idx] = FontVariationAxis(
|
||||||
|
"$TAG_WGHT", weight.toFloat())
|
||||||
|
val updatedFontVariation =
|
||||||
|
FontVariationAxis.toFontVariationSettings(fontVariationArray)
|
||||||
|
textInterpolator.targetPaint.typeface =
|
||||||
|
typefaceCache.getOrElse(weight) {
|
||||||
|
textInterpolator.targetPaint.fontVariationSettings =
|
||||||
|
updatedFontVariation
|
||||||
|
textInterpolator.targetPaint.typeface
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (color != null) {
|
if (color != null) {
|
||||||
textInterpolator.targetPaint.color = color
|
textInterpolator.targetPaint.color = color
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.animation
|
|||||||
import android.animation.AnimatorListenerAdapter
|
import android.animation.AnimatorListenerAdapter
|
||||||
import android.animation.ValueAnimator
|
import android.animation.ValueAnimator
|
||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
|
import android.graphics.fonts.FontVariationAxis
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import android.text.Layout
|
import android.text.Layout
|
||||||
import android.text.StaticLayout
|
import android.text.StaticLayout
|
||||||
@@ -178,4 +179,71 @@ class TextAnimatorTest : SysuiTestCase() {
|
|||||||
|
|
||||||
assertThat(paint.typeface).isSameInstanceAs(prevTypeface)
|
assertThat(paint.typeface).isSameInstanceAs(prevTypeface)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSetTextStyle_addWeight() {
|
||||||
|
testWeightChange("", 100, FontVariationAxis.fromFontVariationSettings("'wght' 100")!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSetTextStyle_changeWeight() {
|
||||||
|
testWeightChange(
|
||||||
|
"'wght' 500",
|
||||||
|
100,
|
||||||
|
FontVariationAxis.fromFontVariationSettings("'wght' 100")!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSetTextStyle_addWeightWithOtherAxis() {
|
||||||
|
testWeightChange(
|
||||||
|
"'wdth' 100",
|
||||||
|
100,
|
||||||
|
FontVariationAxis.fromFontVariationSettings("'wght' 100, 'wdth' 100")!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSetTextStyle_changeWeightWithOtherAxis() {
|
||||||
|
testWeightChange(
|
||||||
|
"'wght' 500, 'wdth' 100",
|
||||||
|
100,
|
||||||
|
FontVariationAxis.fromFontVariationSettings("'wght' 100, 'wdth' 100")!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun testWeightChange(
|
||||||
|
initialFontVariationSettings: String,
|
||||||
|
weight: Int,
|
||||||
|
expectedFontVariationSettings: Array<FontVariationAxis>
|
||||||
|
) {
|
||||||
|
val layout = makeLayout("Hello, World", PAINT)
|
||||||
|
val valueAnimator = mock(ValueAnimator::class.java)
|
||||||
|
val textInterpolator = mock(TextInterpolator::class.java)
|
||||||
|
val paint =
|
||||||
|
TextPaint().apply {
|
||||||
|
typeface = Typeface.createFromFile("/system/fonts/Roboto-Regular.ttf")
|
||||||
|
fontVariationSettings = initialFontVariationSettings
|
||||||
|
}
|
||||||
|
`when`(textInterpolator.targetPaint).thenReturn(paint)
|
||||||
|
|
||||||
|
val textAnimator =
|
||||||
|
TextAnimator(layout, {}).apply {
|
||||||
|
this.textInterpolator = textInterpolator
|
||||||
|
this.animator = valueAnimator
|
||||||
|
}
|
||||||
|
textAnimator.setTextStyle(weight = weight, animate = false)
|
||||||
|
|
||||||
|
val resultFontVariationList =
|
||||||
|
FontVariationAxis.fromFontVariationSettings(
|
||||||
|
textInterpolator.targetPaint.fontVariationSettings
|
||||||
|
)
|
||||||
|
expectedFontVariationSettings.forEach { expectedAxis ->
|
||||||
|
val resultAxis = resultFontVariationList?.filter { it.tag == expectedAxis.tag }?.get(0)
|
||||||
|
assertThat(resultAxis).isNotNull()
|
||||||
|
if (resultAxis != null) {
|
||||||
|
assertThat(resultAxis.styleValue).isEqualTo(expectedAxis.styleValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user