成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手把手教你用 Jetpack Compose 做會(huì)動(dòng)的點(diǎn)贊按鈕!

開發(fā) 前端
畫就像做菜,得分步驟!我們把這個(gè)效果拆成:1. 圓形背景「膨脹」(像吹氣球??)2. 大拇指「閃現(xiàn)」3. 小圓點(diǎn)點(diǎn)「炸煙花」(最炫的part!)4. 所有元素「優(yōu)雅退場(chǎng)」。

??? 四步搞定動(dòng)畫魔法

步驟1:把動(dòng)畫拆成「番茄炒蛋」

畫就像做菜,得分步驟!我們把這個(gè)效果拆成:

1. 圓形背景「膨脹」(像吹氣球??)

2. 大拇指「閃現(xiàn)」

3. 小圓點(diǎn)點(diǎn)「炸煙花」(最炫的part!)

4. 所有元素「優(yōu)雅退場(chǎng)」

// 用枚舉告訴代碼:「現(xiàn)在該哪一步了?」
enum class AnimationState {
    IDLE,          // 靜止?fàn)顟B(tài)
    CIRCLE_GROW,   // 背景圓圈擴(kuò)散
    THUMB_JUMP,    // 點(diǎn)贊圖標(biāo)彈跳
    DOT_EXPLOSION, // 小圓點(diǎn)爆發(fā)
    FINISH         // 動(dòng)畫結(jié)束
}

步驟2:用「時(shí)間管理器」控制動(dòng)畫流程

Jetpack Compose 的 Transition 就像動(dòng)畫導(dǎo)演??,它會(huì)說:「3秒后該放大圓圈了,5秒后彈出大拇指...」

@Composable
fun LikeButton(isLiked: Boolean) {
    // ?? 核心狀態(tài)控制
    var isLiked by remember { mutableStateOf(false) }
    var currentState by remember { mutableStateOf(AnimationState.IDLE) }

    // ?? 單位轉(zhuǎn)換(解決DP/PX混亂問題!)
    val density = LocalDensity.current
    val maxCircleSize = 48.dp
    val maxCirclePx = with(density) { maxCircleSize.toPx() }

    // ?? 動(dòng)畫過渡控制
    val transition = updateTransition(currentState, label = "LikeTransition")

    // ? 定義動(dòng)畫數(shù)值
    // 背景圓圈半徑
    val circleRadius by transition.animateFloat(
        transitionSpec = {
            when {
                AnimationState.IDLE isTransitioningTo AnimationState.CIRCLE_GROW ->
                    tween(300, easing = FastOutSlowInEasing)

                else -> snap()
            }
        }, label = "circleRadius"
    ) { state ->
        when (state) {
            AnimationState.CIRCLE_GROW -> maxCirclePx
            else -> 0f
        }
    }

    // ?? 大拇指圖標(biāo)動(dòng)畫(彈跳效果)
    val thumbScale by transition.animateFloat(
        transitionSpec = {
            keyframes {
                durationMillis = 600
                0f at 0 with LinearEasing
                1.2f at 150
                1f at 300
            }
        }, label = "thumbScale"
    ) { state ->
        when (state) {
            AnimationState.THUMB_JUMP -> 1f
            AnimationState.FINISH -> 1f
            AnimationState.IDLE -> 1f// 確保初始狀態(tài)也顯示
            else -> 0f
        }
    }

    // ?? 爆炸小圓點(diǎn)
    val dotsProgress by transition.animateFloat(
        transitionSpec = { tween(500) },
        label = "dotsProgress"
    ) { state ->
        when (state) {
            AnimationState.DOT_EXPLOSION -> 1f
            else -> 0f
        }
    }

    // ?? 點(diǎn)擊觸發(fā)動(dòng)畫
    LaunchedEffect(isLiked) {
        if (isLiked) {
            currentState = AnimationState.CIRCLE_GROW
            delay(300)
            currentState = AnimationState.THUMB_JUMP
            delay(300)
            currentState = AnimationState.DOT_EXPLOSION
            delay(800)
            currentState = AnimationState.FINISH
        } else {
            currentState = AnimationState.IDLE
        }
    }
    
    // 繪制界面(下一步講)
}

步驟3:畫一個(gè)「會(huì)動(dòng)的圖層」

用 Canvas 和 Box 像PS一樣疊加圖層:背景圈圈在下,點(diǎn)贊圖標(biāo)居中,小圓點(diǎn)環(huán)繞四周。

// ?? 繪制界面
Box(
    modifier = Modifier
        .size(72.dp)
        .clickable { isLiked = !isLiked },
    contentAlignment = Alignment.Center
) {
    // 背景擴(kuò)散圓圈
    if (currentState != AnimationState.IDLE) {
        Canvas(modifier = Modifier.fillMaxSize()) {
            drawCircle(
                color = Color.Red.copy(alpha = 0.2f),
                radius = circleRadius,
                style = Stroke(width = 2.dp.toPx())
            )
        }
    }

    // 大拇指圖標(biāo)(帶彈跳)
    Icon(
        imageVector = Icons.Default.ThumbUp,
        contentDescription = "Like",
        modifier = Modifier
            .size(32.dp)
            .graphicsLayer {
                scaleX = thumbScale
                scaleY = thumbScale
            },
        tint = if (isLiked) Color.Red else Color.Gray
    )

    // 爆炸小圓點(diǎn)
    if (dotsProgress > 0) {
        val angles = listOf(0f, 45f, 90f, 135f, 180f, 225f, 270f, 315f)
        val radius = with(LocalDensity.current) { 48.dp.toPx() } * dotsProgress
        val dotRadius = with(LocalDensity.current) { 4.dp.toPx() }

        Canvas(modifier = Modifier.fillMaxSize()) {
            val center = Offset(size.width / 2, size.height / 2)

            angles.forEach { angle ->
                val radians = Math.toRadians(angle.toDouble())
                val x = center.x + radius * cos(radians).toFloat()
                val y = center.y + radius * sin(radians).toFloat()
                    
                drawCircle(
                    color = Color(0xFFFF6B6B).copy(alpha = 1 - dotsProgress),
                    radius = dotRadius,
                    center = Offset(x, y)
                )
            }
        }
    }
}

步驟4:加億點(diǎn)點(diǎn)細(xì)節(jié)

  • ? 彈性動(dòng)畫:讓圓圈放大時(shí)有「彈簧感」
  • ? 漸隱效果:退場(chǎng)時(shí)用 alpha 動(dòng)畫讓元素淡出

圖片圖片

?? 學(xué)完后你能舉一反三

? 替換成愛心、星星?等不同圖標(biāo)

? 把小圓點(diǎn)改成小星星、花瓣??

? 調(diào)整顏色、動(dòng)畫時(shí)長(zhǎng)、彈跳幅度...

責(zé)任編輯:武曉燕 來源: 沐雨花飛碟
相關(guān)推薦

2011-03-28 16:14:38

jQuery

2021-08-09 13:31:25

PythonExcel代碼

2022-10-19 14:30:59

2021-02-04 09:00:57

SQLDjango原生

2021-02-06 14:55:05

大數(shù)據(jù)pandas數(shù)據(jù)分析

2022-08-04 10:39:23

Jenkins集成CD

2009-04-22 09:17:19

LINQSQL基礎(chǔ)

2021-05-10 06:48:11

Python騰訊招聘

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2012-01-11 13:40:35

移動(dòng)應(yīng)用云服務(wù)

2021-08-02 23:15:20

Pandas數(shù)據(jù)采集

2020-03-08 22:06:16

Python數(shù)據(jù)IP

2021-02-02 13:31:35

Pycharm系統(tǒng)技巧Python

2021-12-11 20:20:19

Python算法線性

2017-10-27 10:29:35

人臉識(shí)別UbuntuPython

2021-06-05 23:51:21

ECharts氣泡圖散點(diǎn)圖

2021-03-23 09:05:52

PythonExcelVlookup

2021-01-30 10:37:18

ScrapyGerapy網(wǎng)絡(luò)爬蟲

2009-08-27 18:10:58

PHP繪制3D圖形
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧美日韩在线不卡 | 黄色大片免费网站 | 国产亚洲一区二区三区 | 久久久成人精品 | 亚洲欧美日韩在线 | 亚洲一区久久 | 99久久精品视频免费 | 久久91精品| 亚洲国产精品久久久久秋霞不卡 | 99综合| www.亚洲.com| 成人免费毛片在线观看 | 国产欧美视频一区二区 | 四虎影院在线观看av | 我要看黄色录像一级片 | 日本一区二区视频 | 日韩视频免费看 | 亚洲精品一区二区三区中文字幕 | 成人综合视频在线观看 | 欧美日韩专区 | 99精品免费 | 97国产在线视频 | 午夜视频在线观看网站 | 精品久久亚洲 | 日本欧美国产在线 | 欧美一区二区三区免费电影 | 国产成人99久久亚洲综合精品 | 国产成人免费在线观看 | 日本黄色高清视频 | 欧美高清免费 | 亚洲成人播放器 | 久久久久久亚洲欧洲 | 欧美国产一区二区 | 亚州精品成人 | 久久婷婷色 | 亚洲成人综合社区 | 国产成人精品一区二区三区在线观看 | 99久久精品国产一区二区三区 | 视频一区二区在线观看 | 亚洲精彩视频 | 国产人成精品一区二区三 |