Преобразовать форму карты в состав реактивного ранца

может кто-нибудь сказать мне, как создать форму ниже в компоновке реактивного ранца

заранее спасибо

это imgur.com/a/KV2uRQN похоже на то, что вам нужно?

Raghunandan 22.02.2023 18:28

выглядит идеально, можете ли вы поделиться здесь кодом, как вы его создали!

Jayant Kumar 22.02.2023 18:36
1
2
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

CustomShape вдохновлен https://juliensalvi.medium.com/custom-shape-with-jetpack-compose-1cb48a991d42

Это расширение добавления путей с линиями и дугами.

Для трансформации достаточно вращения по оси Y https://developer.android.com/jetpack/compose/graphics/draw/modifiers

Закругленная граница и пользовательская форма фона вместе с графическим слоем, который вращается по оси Y.

class CustomCardShape(private val radius: Float) : Shape {
    override fun createOutline(
        size: Size,
        layoutDirection: LayoutDirection,
        density: Density
    ): Outline {
        return Outline.Generic(
            path = drawCardShape(size, radius)
        )
    }
}

Форма с путем

fun drawCardShape(size: Size, cornerRadius: Float): Path {
    return Path().apply {
        reset()
        // Top left arc
        arcTo(
            rect = Rect(
                left = 0f,
                top = 0f,
                right = cornerRadius,
                bottom = cornerRadius
            ),
            startAngleDegrees = 180.0f,
            sweepAngleDegrees = 90.0f,
            forceMoveTo = false
        )
        lineTo(x = size.width - cornerRadius, y = 0f)
        // Top right arc
        arcTo(
            rect = Rect(
                left = size.width - cornerRadius,
                top = 0f,
                right = size.width,
                bottom = cornerRadius
            ),
            startAngleDegrees = 270.0f,
            sweepAngleDegrees = 90.0f,
            forceMoveTo = false
        )
        lineTo(x = size.width, y = size.height - cornerRadius)
        // Bottom right arc
        arcTo(
            rect = Rect(
                left = size.width - cornerRadius,
                top = size.height - cornerRadius,
                right = size.width,
                bottom = size.height
            ),
            startAngleDegrees = 0.0f,
            sweepAngleDegrees = 90.0f,
            forceMoveTo = false
        )
        lineTo(x = cornerRadius, y = size.height)
        // Bottom left arc
        arcTo(
            rect = Rect(
                left = 0f,
                top = size.height - cornerRadius,
                right = cornerRadius,
                bottom = size.height
            ),
            startAngleDegrees = 90.0f,
            sweepAngleDegrees = 90.0f,
            forceMoveTo = false
        )
        lineTo(x = 0f, y = cornerRadius)
        close()
    }
}

Карта составная

   Card(modifier = modifier
        .height(300.dp)
        .width(400.dp)
        .graphicsLayer {
            // pivot of where the rotation shud happen
            this.transformOrigin = TransformOrigin(0f, 0f)
            this.rotationY = 5f
        }.shadow(elevation = 4.dp, shape = CustomCardShape(80f),
            ambientColor  = Color(0xff2f5e9b),
            spotColor = Color(0xff2f5e9b)),
        border = BorderStroke(5.dp,Color(0xff5d6474)),
        backgroundColor = Color(0xff333d51),shape = CustomCardShape(80f)){

    }

Результат

Вышеупомянутое может быть не совсем таким, как на снимке экрана, однако вы можете поиграть со значениями, чтобы получить именно то, что хотите.

Вы также можете сделать это, нет необходимости создавать собственную форму

@Composable
fun CustomCard() {

    Card(
        modifier = Modifier
            .height(300.dp)
            .width(600.dp)
            .padding(20.dp)
            .graphicsLayer {
                this.transformOrigin = TransformOrigin(0f, 0f)
                this.rotationY = 7f
            },
        border = BorderStroke(3.dp, Color(0xff5d6474)),
        backgroundColor = Color(0xff333d51), shape = RoundedCornerShape(80f)
    ) {

    }

}

В графическом слое просто поверните ось Y.

Это то же самое, что и выше, за исключением того, что по умолчанию используется форма roundedcornershape.

Raghunandan 23.02.2023 06:53

Да, верно .....

Jayant Kumar 23.02.2023 07:16

Другие вопросы по теме