diff --git a/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt b/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt index 5ab2f12d01..5eb05a24d0 100644 --- a/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt +++ b/demos/effect/src/main/java/androidx/media3/demo/effect/EffectActivity.kt @@ -18,6 +18,7 @@ package androidx.media3.demo.effect import android.Manifest import android.net.Uri import android.os.Bundle +import android.text.SpannableString import androidx.activity.ComponentActivity import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.setContent @@ -41,6 +42,7 @@ import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.Checkbox import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.RadioButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Slider @@ -69,6 +71,8 @@ import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.Util.SDK_INT import androidx.media3.effect.Contrast import androidx.media3.effect.OverlayEffect +import androidx.media3.effect.StaticOverlaySettings +import androidx.media3.effect.TextOverlay import androidx.media3.effect.TextureOverlay import androidx.media3.exoplayer.ExoPlayer import androidx.media3.ui.PlayerView @@ -290,6 +294,16 @@ class EffectActivity : ComponentActivity() { if (effectControlsState.confettiOverlayChecked) { overlaysBuilder.add(ConfettiOverlay()) } + if (effectControlsState.textOverlayChecked && effectControlsState.textOverlayText != null) { + val spannableOverlayText = SpannableString(effectControlsState.textOverlayText) + val staticOverlaySettings = + StaticOverlaySettings.Builder() + .setAlphaScale(effectControlsState.textOverlayAlpha) + .build() + overlaysBuilder.add( + TextOverlay.createStaticTextOverlay(spannableOverlayText, staticOverlaySettings) + ) + } effectsList += OverlayEffect(overlaysBuilder.build()) onApplyEffectsClicked(effectsList) @@ -355,6 +369,59 @@ class EffectActivity : ComponentActivity() { }, ) } + item { + EffectItem( + name = stringResource(R.string.custom_text_overlay), + enabled = enabled, + onCheckedChange = { checked -> + onEffectControlsStateChange( + effectControlsState.copy(effectsChanged = !checked, textOverlayChecked = checked) + ) + }, + ) { + Column { + OutlinedTextField( + value = effectControlsState.textOverlayText ?: "", + onValueChange = { newTextOverlayText -> + onEffectControlsStateChange( + effectControlsState.copy( + effectsChanged = true, + textOverlayText = newTextOverlayText.ifEmpty { null }, + ) + ) + }, + label = { Text(stringResource(R.string.text)) }, + singleLine = true, + modifier = + Modifier.fillMaxWidth().padding(bottom = dimensionResource(R.dimen.large_padding)), + ) + Row { + Text( + text = + stringResource(R.string.alpha) + + " = %.2f".format(effectControlsState.textOverlayAlpha), + style = MaterialTheme.typography.bodyLarge, + modifier = + Modifier.padding(dimensionResource(id = R.dimen.large_padding)).weight(1f), + ) + Slider( + value = effectControlsState.textOverlayAlpha, + onValueChange = { newAlphaValue -> + val newRoundedAlphaValue = "%.2f".format(newAlphaValue).toFloat() + onEffectControlsStateChange( + effectControlsState.copy( + effectsChanged = effectControlsState.textOverlayText != null, + textOverlayAlpha = newRoundedAlphaValue, + ) + ) + }, + valueRange = 0f..1f, + modifier = Modifier.weight(2f), + ) + } + } + } + } } } @@ -401,13 +468,16 @@ class EffectActivity : ComponentActivity() { } } - data class EffectControlsState( + private data class EffectControlsState( val effectsChanged: Boolean = false, val contrastValue: Float = 0f, val confettiOverlayChecked: Boolean = false, + val textOverlayChecked: Boolean = false, + val textOverlayText: String? = null, + val textOverlayAlpha: Float = 1f, ) - companion object { + private companion object { const val JSON_FILENAME = "media.playlist.json" } } diff --git a/demos/effect/src/main/res/values/strings.xml b/demos/effect/src/main/res/values/strings.xml index d6977494a3..4fb62669e1 100644 --- a/demos/effect/src/main/res/values/strings.xml +++ b/demos/effect/src/main/res/values/strings.xml @@ -25,4 +25,7 @@ "Permission was not granted." Contrast Confetti Overlay + Custom Text Overlay + Text + Alpha