Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -255,5 +255,17 @@ object PlasmaStardsComposeComponents : ComponentsProviderCompose() {
"PaginationDotsVertical" to PlasmaStardsPaginationDotsVerticalVariationsCompose,
),
),
ComposeComponent(
ComponentKey.RectSkeleton,
mapOf(
"RectSkeleton" to PlasmaStardsRectSkeletonVariationsCompose,
),
),
ComposeComponent(
ComponentKey.TextSkeleton,
mapOf(
"TextSkeleton" to PlasmaStardsTextSkeletonVariationsCompose,
),
),
).associateBy { it.key }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sdds.playground.sandbox.plasma.stards.integration.compose

import androidx.compose.runtime.Composable
import com.sdds.compose.uikit.RectSkeletonStyle
import com.sdds.compose.uikit.style.style
import com.sdds.playground.sandbox.core.integration.ComposeStyleProvider
import com.sdkit.star.designsystem.styles.rectskeleton.Default
import com.sdkit.star.designsystem.styles.rectskeleton.RectSkeleton

internal object PlasmaStardsRectSkeletonVariationsCompose : ComposeStyleProvider<String, RectSkeletonStyle>() {
override val variations: Map<String, @Composable () -> RectSkeletonStyle> =
mapOf(
"Default" to { RectSkeleton.Default.style() },
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sdds.playground.sandbox.plasma.stards.integration.compose

import androidx.compose.runtime.Composable
import com.sdds.compose.uikit.TextSkeletonStyle
import com.sdds.compose.uikit.style.style
import com.sdds.playground.sandbox.core.integration.ComposeStyleProvider
import com.sdkit.star.designsystem.styles.textskeleton.Default
import com.sdkit.star.designsystem.styles.textskeleton.TextSkeleton

internal object PlasmaStardsTextSkeletonVariationsCompose : ComposeStyleProvider<String, TextSkeletonStyle>() {
override val variations: Map<String, @Composable () -> TextSkeletonStyle> =
mapOf(
"Default" to { TextSkeleton.Default.style() },
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sdds.playground.sandbox.plasma.stards.integration.view

import com.sdds.playground.sandbox.core.integration.ViewStyleProvider
import com.sdkit.star.designsystem.R as DsR

internal object PlasmaStardsRectSkeletonVariationsView : ViewStyleProvider<String>() {
override val variations: Map<String, Int> =
mapOf(
"Default" to DsR.style.Sdkit_StarDs_ComponentOverlays_RectSkeleton,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sdds.playground.sandbox.plasma.stards.integration.view

import com.sdds.playground.sandbox.core.integration.ViewStyleProvider
import com.sdkit.star.designsystem.R as DsR

internal object PlasmaStardsTextSkeletonVariationsView : ViewStyleProvider<String>() {
override val variations: Map<String, Int> =
mapOf(
"Default" to DsR.style.Sdkit_StarDs_ComponentOverlays_TextSkeleton,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -258,5 +258,17 @@ object PlasmaStardsViewComponents : ComponentsProviderView() {
"PaginationDotsVertical" to PlasmaStardsPaginationDotsVerticalVariationsView,
),
),
ViewComponent(
ComponentKey.RectSkeleton,
mapOf(
"RectSkeleton" to PlasmaStardsRectSkeletonVariationsView,
),
),
ViewComponent(
ComponentKey.TextSkeleton,
mapOf(
"TextSkeleton" to PlasmaStardsTextSkeletonVariationsView,
),
),
).associateBy { it.key }
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.annotation.StyleRes
import com.sdds.testing.R
import com.sdds.testing.vs.getTextColorPrimary
import com.sdds.testing.vs.styleWrapper
import com.sdds.uikit.RectSkeleton
import com.sdds.uikit.SkeletonLineWidthProvider
Expand Down Expand Up @@ -87,6 +88,7 @@ private fun text(
id = R.id.text_over_skeleton
layoutParams =
ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
setTextColor(context.getTextColorPrimary())
setTextAppearance(textStyle)
}
}
Expand Down
67 changes: 60 additions & 7 deletions sdds-core/uikit/src/main/kotlin/com/sdds/uikit/ShimmerLayout.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import android.graphics.PorterDuffXfermode
import android.graphics.Shader
import android.util.AttributeSet
import android.view.animation.LinearInterpolator
import androidx.annotation.ColorInt
import androidx.core.content.withStyledAttributes
import com.sdds.uikit.internal.base.lerp
import com.sdds.uikit.shader.GradientShader
Expand All @@ -19,9 +20,13 @@ import com.sdds.uikit.shape.ShapeDrawable
import com.sdds.uikit.statelist.ColorValueHolder
import com.sdds.uikit.statelist.ColorValueStateList
import com.sdds.uikit.statelist.getColorValueStateList
import kotlin.math.roundToInt

/**
* Контейнер для отрисовки эффекта мерцания
* Контейнер для отрисовки эффекта мерцания.
* Если установить цвет, то эффект мерцания будет достигаться за счет изменения альфы установленного цвета.
* Если установить градиент (шейдер), то эффект мерцания будет достигаться за счет перемещения прямоугольника с примененным шейдером.
*
* @param context контекст
* @param attrs аттрибуты view
* @param defStyleAttr аттрибут стиля по умолчанию
Expand All @@ -35,6 +40,9 @@ open class ShimmerLayout @JvmOverloads constructor(
) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) {

private val shimmerPaint = Paint()

@ColorInt
private var shimmerColor: Int? = null
private var shimmerShaderFactory: ShaderFactory? = null
private var shimmerShader: Shader? = null
private val shaderMatrix: Matrix = Matrix()
Expand All @@ -43,18 +51,27 @@ open class ShimmerLayout @JvmOverloads constructor(

private var shimmerDuration: Long = DEFAULT_DURATION.toLong()

private var shimmerTranslateXFraction = 0f
private var shimmerFraction = 0f
private val shimmerAnimationWidth = Resources.getSystem().displayMetrics.widthPixels.toFloat()
private val animator: ValueAnimator = ValueAnimator.ofFloat(1f).apply {

private val isBlinkingShimmer: Boolean
get() = shimmerColor != null

private val baseAnimator: ValueAnimator = ValueAnimator.ofFloat(1f).apply {
duration = shimmerDuration
repeatCount = ValueAnimator.INFINITE
interpolator = LinearInterpolator()
addUpdateListener {
shimmerTranslateXFraction = it.animatedValue as Float
shimmerFraction = it.animatedValue as Float
invalidate()
}
}

private val animator: ValueAnimator
get() = baseAnimator.apply {
repeatMode = if (isBlinkingShimmer) ValueAnimator.REVERSE else ValueAnimator.RESTART
}

/**
* Включает/выключает автоматический запуск анимации эффекта мерцания
*/
Expand Down Expand Up @@ -85,12 +102,13 @@ open class ShimmerLayout @JvmOverloads constructor(
/**
* Устанавливает список [ColorValueStateList] для эффекта мерцания.
* В указанном [list] может быть либо ссылка на [ShapeDrawable] с установленным [ShaderFactory], либо ссылка
* на стиль шейдера
* на стиль шейдера, либо на цвет.
*/
fun setShimmerShaderList(list: ColorValueStateList?) {
if (_shimmerList != list) {
_shimmerList = list
updateShaderFactory()
updateColor()
invalidate()
}
}
Expand All @@ -102,10 +120,20 @@ open class ShimmerLayout @JvmOverloads constructor(
*/
fun setShimmerShader(shaderFactory: ShaderFactory) {
shimmerShaderFactory = shaderFactory
shimmerColor = null
createShader()
invalidate()
}

/**
* Устанавливает цвет [color] для эффекта мерцания.
*/
fun setShimmerColor(@ColorInt color: Int) {
shimmerColor = color
shimmerShaderFactory = null
invalidate()
}

/**
* Устанавливает [durationMillis] - длительность анимации эффекта мерцания в миллисекундах.
* Длительность должна быть ус
Expand Down Expand Up @@ -162,13 +190,26 @@ open class ShimmerLayout @JvmOverloads constructor(
super.dispatchDraw(canvas)
shimmerShader?.let {
shaderMatrix.setTranslate(
lerp(-shimmerAnimationWidth, shimmerAnimationWidth, shimmerTranslateXFraction),
lerp(-shimmerAnimationWidth, shimmerAnimationWidth, shimmerFraction),
0f,
)
it.setLocalMatrix(shaderMatrix)
shimmerPaint.shader = it
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), shimmerPaint)
}
shimmerColor?.let {
shimmerPaint.color = it
shimmerPaint.alpha = lerp(
a = shimmerPaint.alpha,
b = shimmerPaint.alpha + alphaFloatToInt(DEFAULT_BLINK_ALPHA_DELTA),
fraction = shimmerFraction,
)
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), shimmerPaint)
}
}

private fun alphaFloatToInt(alpha: Float): Int {
return (alpha.coerceIn(0f, 1f) * 255).roundToInt()
}

override fun onDetachedFromWindow() {
Expand All @@ -179,17 +220,29 @@ open class ShimmerLayout @JvmOverloads constructor(
override fun drawableStateChanged() {
super.drawableStateChanged()
updateShaderFactory()
updateColor()
}

private fun updateShaderFactory() {
shimmerShaderFactory = when (val shimmer = _shimmerList?.getValueForState(drawableState)) {
val shimmer = _shimmerList?.getValueForState(drawableState)
shimmerShaderFactory = when (shimmer) {
is ColorValueHolder.DrawableValue -> (shimmer.value as? ShapeDrawable)?.shaderFactory
is ColorValueHolder.ShaderValue -> shimmer.value
else -> null
}
}

private fun updateColor() {
val shimmer = _shimmerList?.getValueForState(drawableState)
shimmerColor = when (shimmer) {
is ColorValueHolder.ColorValue -> shimmer.value
is ColorValueHolder.ColorListValue -> shimmer.value.defaultColor
else -> null
}
}

private companion object {
const val DEFAULT_DURATION = 1000
const val DEFAULT_BLINK_ALPHA_DELTA = 0.08f
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.Context
import android.text.TextPaint
import android.util.AttributeSet
import android.view.ViewGroup
import androidx.annotation.ColorInt
import androidx.annotation.StyleRes
import androidx.core.content.withStyledAttributes
import androidx.core.view.children
Expand Down Expand Up @@ -142,6 +143,13 @@ open class TextSkeleton @JvmOverloads constructor(
modifyChildren { it.setShimmerShader(shaderFactory) }
}

/**
* Устанавливает цвет [color] для эффекта мерцания.
*/
fun setShimmerColor(@ColorInt color: Int) {
modifyChildren { it.setShimmerColor(color) }
}

/**
* Устанавливает [durationMillis] - длительность анимации эффекта мерцания в миллисекундах.
* Длительность должна быть ус
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import android.view.ViewGroup
import androidx.annotation.StyleRes
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isGone
import kotlin.math.roundToInt

/**
* Удобный вариант [lazy] с [LazyThreadSafetyMode.NONE]
Expand Down Expand Up @@ -46,6 +47,13 @@ internal fun lerp(a: Float, b: Float, fraction: Float): Float {
return a * (1f - fraction) + (b * fraction)
}

/**
* Рассчитывает линейную интерполяцию между значениями [a] в [b]
*/
internal fun lerp(a: Int, b: Int, fraction: Float): Int {
return (a * (1f - fraction) + (b * fraction)).roundToInt()
}

/**
* Оборачивает [Drawable] в [InsetDrawable]
* @param left отступ слева
Expand Down
22 changes: 22 additions & 0 deletions tokens/plasma-stards-compose/config-info-compose.json
Original file line number Diff line number Diff line change
Expand Up @@ -3781,6 +3781,28 @@
"composeReference": "PaginationDotsVertical.S.ActiveTypeLine"
}
]
},
{
"key": "rect-skeleton",
"coreName": "RectSkeleton",
"styleName": "RectSkeleton",
"variations": [
{
"name": "Default",
"composeReference": "RectSkeleton.Default"
}
]
},
{
"key": "text-skeleton",
"coreName": "TextSkeleton",
"styleName": "TextSkeleton",
"variations": [
{
"name": "Default",
"composeReference": "TextSkeleton.Default"
}
]
}
]
}
2 changes: 1 addition & 1 deletion tokens/plasma-stards-compose/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ versionMinor=22
versionPatch=0

theme-url=https://github.com/salute-developers/theme-converter/raw/main/themes/plasma_stards/0.7.0-alpha.zip
components-version=0.14.0
components-version=0.15.0

summary.key=plasmaStarDS

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// AUTO-GENERATED. DO NOT MODIFY this file.
package com.sdkit.star.designsystem.styles.rectskeleton

/**
* Вспомогательный объект для описания API и стиля компонента RectSkeleton
*/
public object RectSkeleton
Loading
Loading