141 lines
4.0 KiB
Kotlin
141 lines
4.0 KiB
Kotlin
package me.him188.ani.danmaku.ui
|
|
|
|
import androidx.compose.runtime.Immutable
|
|
import androidx.compose.runtime.Stable
|
|
import androidx.compose.ui.graphics.Color
|
|
import androidx.compose.ui.graphics.Shadow
|
|
import androidx.compose.ui.graphics.StrokeJoin
|
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
|
import androidx.compose.ui.text.TextStyle
|
|
import androidx.compose.ui.text.font.FontWeight
|
|
import androidx.compose.ui.text.style.TextMotion
|
|
import androidx.compose.ui.unit.Dp
|
|
import androidx.compose.ui.unit.TextUnit
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.compose.ui.unit.sp
|
|
import kotlinx.serialization.Transient
|
|
|
|
/**
|
|
* Configuration for the presentation of each `me.him188.ani.danmaku.api.Danmaku`.
|
|
*/
|
|
@Immutable
|
|
data class DanmakuConfig(
|
|
// 备注: 增加新的属性后还要修改 [DanmakuConfigData]
|
|
/**
|
|
* Controls the text styles of the [Danmaku].
|
|
* For example, font size, stroke width.
|
|
*/
|
|
val style: DanmakuStyle = DanmakuStyle.Default,
|
|
/**
|
|
* Time for the [Danmaku] to move from the right edge to the left edge of the screen.
|
|
* In other words, it controls the movement speed of a [Danmaku].
|
|
*
|
|
* Unit: dp/s
|
|
*/
|
|
val speed: Float = 88f,
|
|
/**
|
|
* The minimum distance between two [Danmaku]s so that they don't overlap.
|
|
*/
|
|
val safeSeparation: Dp = 36.dp,
|
|
/**
|
|
* 弹幕在屏幕中的显示区域. 0.1 表示屏幕的 10%.
|
|
*
|
|
* 范围: `[0, 1]`
|
|
*/
|
|
val displayArea: Float = 0.25f,
|
|
/**
|
|
* 允许彩色弹幕. 禁用时将会把所有彩色弹幕都显示为白色.
|
|
*/
|
|
val enableColor: Boolean = true,
|
|
/**
|
|
* @since 3.1.0-beta04
|
|
*/
|
|
val enableTop: Boolean = true,
|
|
/**
|
|
* @since 3.1.0-beta04
|
|
*/
|
|
val enableFloating: Boolean = true,
|
|
/**
|
|
* @since 3.1.0-beta04
|
|
*/
|
|
val enableBottom: Boolean = true,
|
|
/**
|
|
* 调试模式, 启用发送弹幕的信息和弹幕处理信息.
|
|
*/
|
|
val isDebug: Boolean = false,
|
|
@Suppress("PropertyName") @Transient val _placeholder: Int = 0,
|
|
) {
|
|
companion object {
|
|
@Stable
|
|
val Default = DanmakuConfig()
|
|
}
|
|
}
|
|
|
|
@Immutable
|
|
class DanmakuStyle(
|
|
val fontSize: TextUnit = 18.sp,
|
|
val fontWeight: FontWeight = FontWeight.W600,
|
|
val alpha: Float = 0.8f,
|
|
val strokeColor: Color = Color.Black,
|
|
val strokeWidth: Float = 4f,
|
|
val shadow: Shadow? = null,
|
|
) {
|
|
@Stable
|
|
fun styleForBorder(): TextStyle = TextStyle(
|
|
fontSize = fontSize,
|
|
color = strokeColor,
|
|
fontWeight = fontWeight,
|
|
drawStyle = Stroke(
|
|
miter = 3f,
|
|
width = strokeWidth,
|
|
join = StrokeJoin.Round,
|
|
),
|
|
textMotion = TextMotion.Animated,
|
|
shadow = shadow,
|
|
)
|
|
|
|
// 'inside' the border
|
|
@Stable
|
|
fun styleForText(color: Color = Color.White): TextStyle = TextStyle(
|
|
fontSize = fontSize,
|
|
color = color,
|
|
fontWeight = fontWeight,
|
|
textMotion = TextMotion.Animated,
|
|
)
|
|
|
|
fun copy(
|
|
fontSize: TextUnit = this.fontSize,
|
|
fontWeight: FontWeight = this.fontWeight,
|
|
alpha: Float = this.alpha,
|
|
strokeColor: Color = this.strokeColor,
|
|
strokeWidth: Float = this.strokeWidth,
|
|
shadow: Shadow? = this.shadow,
|
|
): DanmakuStyle {
|
|
if (fontSize == this.fontSize &&
|
|
fontWeight == this.fontWeight &&
|
|
alpha == this.alpha &&
|
|
strokeColor == this.strokeColor &&
|
|
strokeWidth == this.strokeWidth &&
|
|
shadow == this.shadow
|
|
) {
|
|
return this
|
|
}
|
|
return DanmakuStyle(
|
|
fontSize = fontSize,
|
|
fontWeight = fontWeight,
|
|
alpha = alpha,
|
|
strokeColor = strokeColor,
|
|
strokeWidth = strokeWidth,
|
|
shadow = shadow,
|
|
)
|
|
}
|
|
|
|
override fun toString(): String {
|
|
return "DanmakuStyle(fontSize=$fontSize, fontWeight=$fontWeight, alpha=$alpha, strokeColor=$strokeColor, strokeMiter=$strokeWidth, shadow=$shadow)"
|
|
}
|
|
|
|
companion object {
|
|
@Stable
|
|
val Default = DanmakuStyle()
|
|
}
|
|
} |