最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Android實(shí)現(xiàn)一種點(diǎn)贊動(dòng)畫效果的全過(guò)程

 更新時(shí)間:2022年12月06日 10:22:30   作者:ChenYhong  
最近做項(xiàng)目需要實(shí)現(xiàn)點(diǎn)贊動(dòng)畫,下面這篇文章主要給大家介紹了關(guān)于利用Android實(shí)現(xiàn)一種點(diǎn)贊動(dòng)畫效果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近有個(gè)需求,需要仿照公司的H5實(shí)現(xiàn)一個(gè)游戲助手,其中一個(gè)點(diǎn)贊的按鈕有動(dòng)畫效果,如下圖:

分析一下這個(gè)動(dòng)畫,點(diǎn)擊按鈕后,拇指首先有個(gè)縮放的效果,然后有5個(gè)拇指朝不同的方向移動(dòng),其中部分有放大的效果。

點(diǎn)擊后的縮放效果

本文通過(guò)ScaleAnimation 實(shí)現(xiàn)縮放效果,代碼如下:

private fun playThumbUpScaleAnimator() {
    // x、y軸方向都從1倍放大到2倍,以控件的中心為原點(diǎn)進(jìn)行縮放
    ScaleAnimation(1f, 2f, 1f, 2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f).run {
        // 先取消控件當(dāng)前的動(dòng)畫效果(重復(fù)點(diǎn)擊時(shí))
        view.clearAnimation()
        // 設(shè)置動(dòng)畫的持續(xù)時(shí)間
        duration = 300
        // 開始播放動(dòng)畫
        view.startAnimation(this)
    }
}

拇指的散開效果

有5個(gè)拇指分別往不同的方向移動(dòng),本文通過(guò)動(dòng)態(tài)添加View,并對(duì)View設(shè)置動(dòng)畫來(lái)實(shí)現(xiàn)??梢钥吹皆谝苿?dòng)的同時(shí)還有縮放的效果,所以需要同時(shí)播放幾個(gè)動(dòng)畫。

本文通過(guò)ValueAnimatorAnimatorSet來(lái)實(shí)現(xiàn)該效果,代碼如圖:

// 此數(shù)組控制動(dòng)畫的效果
// 第一個(gè)參數(shù)控制X軸移動(dòng)距離
// 第二個(gè)參數(shù)控制Y軸移動(dòng)距離
// 第三個(gè)參數(shù)控制縮放的倍數(shù)(基于原大?。?
val animatorConfig: ArrayList<ArrayList<Float>> = arrayListOf(
    arrayListOf(-160f, 150f, 1f),
    arrayListOf(80f, 130f, 1.1f),
    arrayListOf(-120f, -170f, 1.3f),
    arrayListOf(80f, -130f, 1f),
    arrayListOf(-20f, -80f, 0.8f))

private fun playDiffusionAnimator() {
    for (index in 0 until 5) {
        binding.root.run {
            if (this is ViewGroup) {
                // 創(chuàng)建控件
                val ivThumbUp = AppCompatImageView(context)
                ivThumbUp.setImageResource(R.drawable.icon_thumb_up)
                // 設(shè)置與原控件一樣的大小
                ivThumbUp.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(25), DensityUtil.dp2Px(25))
                // 先設(shè)置為全透明
                ivThumbUp.alpha = 0f
                addView(ivThumbUp)
                // 設(shè)置與原控件一樣的位置
                ivThumbUp.x = binding.ivThumbUp.x
                ivThumbUp.y = binding.ivThumbUp.y
                AnimatorSet().apply {
                    // 設(shè)置動(dòng)畫集開始播放前的延遲
                    startDelay = 330L + index * 50L
                    // 設(shè)置動(dòng)畫監(jiān)聽
                    addListener(object : Animator.AnimatorListener {
                        override fun onAnimationStart(animation: Animator) {
                            // 開始播放時(shí)把控件設(shè)置為不透明
                            ivThumbUp.alpha = 1f
                        }

                        override fun onAnimationEnd(animation: Animator) {
                            // 播放結(jié)束后再次設(shè)置為透明,并從根布局中移除
                            ivThumbUp.alpha = 0f
                            ivThumbUp.clearAnimation()
                            ivThumbUp.post { removeView(ivThumbUp) }
                        }

                        override fun onAnimationCancel(animation: Animator) {}

                        override fun onAnimationRepeat(animation: Animator) {}
                    })
                    // 設(shè)置三個(gè)動(dòng)畫同時(shí)播放
                    playTogether(
                        // 縮放動(dòng)畫
                        ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                            duration = 700
                            // 設(shè)置插值器,速度一開始快,快結(jié)束時(shí)減慢
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                 (values.animatedValue as Float).let { value ->
                                    ivThumbUp.scaleX = value
                                    ivThumbUp.scaleY = value
                                }
                            }
                        },
                        // X軸的移動(dòng)動(dòng)畫
                        ValueAnimator.ofFloat(ivThumbUp.x, ivThumbUp.x + animatorConfig[index][0]).apply {
                            duration = 700
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                ivThumbUp.x = values.animatedValue as Float
                            }
                        },
                        // Y軸的移動(dòng)動(dòng)畫
                        ValueAnimator.ofFloat(ivThumbUp.y, ivThumbUp.y + animatorConfig[index][1]).apply {
                            duration = 700
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                ivThumbUp.y = values.animatedValue as Float
                            }
                        })
                }.start()
            }
        }
    }
}

示例

整合之后做了個(gè)示例Demo,完整代碼如下:

class AnimatorSetExampleActivity : BaseGestureDetectorActivity() {

    private lateinit var binding: LayoutAnimatorsetExampleActivityBinding

    private val animatorConfig: ArrayList<java.util.ArrayList<Float>> = arrayListOf(
        arrayListOf(-160f, 150f, 1f),
        arrayListOf(80f, 130f, 1.1f),
        arrayListOf(-120f, -170f, 1.3f),
        arrayListOf(80f, -130f, 1f),
        arrayListOf(-20f, -80f, 0.8f))


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.layout_animatorset_example_activity)
        binding.ivThumbUp.setOnClickListener {
            playThumbUpScaleAnimator()
            playDiffusionAnimator()
        }
    }

    private fun playThumbUpScaleAnimator() {
        // x,y軸方向都從1倍放大到2倍,以控件的中心為原點(diǎn)進(jìn)行縮放
        ScaleAnimation(1f, 2f, 1f, 2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f).run {
            // 先取消控件當(dāng)前的動(dòng)畫效果(重復(fù)點(diǎn)擊時(shí))
            binding.ivThumbUp.clearAnimation()
            // 設(shè)置動(dòng)畫的持續(xù)時(shí)間
            duration = 300
            // 開始播放動(dòng)畫
            binding.ivThumbUp.startAnimation(this)
        }
    }

    private fun playDiffusionAnimator() {
        for (index in 0 until 5) {
            binding.root.run {
                if (this is ViewGroup) {
                    // 創(chuàng)建控件
                    val ivThumbUp = AppCompatImageView(context)
                    ivThumbUp.setImageResource(R.drawable.icon_thumb_up)
                    // 設(shè)置與原控件一樣的大小
                    ivThumbUp.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(25), DensityUtil.dp2Px(25))
                    // 先設(shè)置為全透明
                    ivThumbUp.alpha = 0f
                    addView(ivThumbUp)
                    // 設(shè)置與原控件一樣的位置
                    ivThumbUp.x = binding.ivThumbUp.x
                    ivThumbUp.y = binding.ivThumbUp.y
                    AnimatorSet().apply {
                        // 設(shè)置動(dòng)畫集開始播放前的延遲
                        startDelay = 330L + index * 50L
                        // 設(shè)置動(dòng)畫監(jiān)聽
                        addListener(object : Animator.AnimatorListener {
                            override fun onAnimationStart(animation: Animator) {
                                // 開始播放時(shí)把控件設(shè)置為不透明
                                ivThumbUp.alpha = 1f
                            }

                            override fun onAnimationEnd(animation: Animator) {
                                // 播放結(jié)束后再次設(shè)置為透明,并從根布局中移除
                                ivThumbUp.alpha = 0f
                                ivThumbUp.clearAnimation()
                                ivThumbUp.post { removeView(ivThumbUp) }
                            }

                            override fun onAnimationCancel(animation: Animator) {}

                            override fun onAnimationRepeat(animation: Animator) {}
                        })
                        // 設(shè)置三個(gè)動(dòng)畫同時(shí)播放
                        playTogether(
                            // 縮放動(dòng)畫
                            ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                                duration = 700
                                // 設(shè)置插值器,速度一開始快,快結(jié)束時(shí)減緩
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    (values.animatedValue as Float).let { value ->
                                        ivThumbUp.scaleX = value
                                        ivThumbUp.scaleY = value
                                    }
                                }
                            },
                            // Y軸的移動(dòng)動(dòng)畫
                            ValueAnimator.ofFloat(ivThumbUp.x, ivThumbUp.x + animatorConfig[index][0]).apply {
                                duration = 700
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    ivThumbUp.x = values.animatedValue as Float
                                }
                            },
                            // X軸的移動(dòng)動(dòng)畫
                            ValueAnimator.ofFloat(ivThumbUp.y, ivThumbUp.y + animatorConfig[index][1]).apply {
                                duration = 700
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    ivThumbUp.y = values.animatedValue as Float
                                }
                            })
                    }.start()
                }
            }
        }
    }
}

效果如圖:

個(gè)人感覺還原度還是可以的哈哈。

總結(jié)

到此這篇關(guān)于利用Android實(shí)現(xiàn)一種點(diǎn)贊動(dòng)畫效果的文章就介紹到這了,更多相關(guān)Android點(diǎn)贊動(dòng)畫實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • andriod開發(fā)之Activity的渲染機(jī)制

    andriod開發(fā)之Activity的渲染機(jī)制

    本文給大家分享的是在andriod開發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說(shuō)明,主要是通過(guò)實(shí)例給大家講解Activity是如何畫到屏幕上的,希望大家能夠喜歡
    2018-03-03
  • Android?組件化神器之Arouter依賴配置使用

    Android?組件化神器之Arouter依賴配置使用

    這篇文章主要為大家介紹了Android?組件化神器之Arouter依賴配置使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Android使用MulticastSocket實(shí)現(xiàn)多點(diǎn)廣播圖片

    Android使用MulticastSocket實(shí)現(xiàn)多點(diǎn)廣播圖片

    這篇文章主要為大家詳細(xì)介紹了Android使用MulticastSocket實(shí)現(xiàn)多點(diǎn)廣播圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android實(shí)現(xiàn)傾斜角標(biāo)樣式

    Android實(shí)現(xiàn)傾斜角標(biāo)樣式

    最新小編接到這樣一個(gè)項(xiàng)目,需要在一個(gè)距形卡片上做一個(gè)傾斜的Tag,類似支付寶上的一個(gè)功能,接著小編給大家?guī)?lái)了實(shí)現(xiàn)思路,對(duì)android 傾斜角標(biāo)的實(shí)現(xiàn)方法感興趣的朋友跟隨小編一起看看吧
    2019-10-10
  • 詳解Flutter如何完全自定義TabBar

    詳解Flutter如何完全自定義TabBar

    在App中TabBar形式交互是非常常見的,但是系統(tǒng)提供的的樣式大多數(shù)又不能滿足我們產(chǎn)品和UI的想法,本文記錄了在Flutter中如何實(shí)現(xiàn)自定義TabBar的一個(gè)思路和過(guò)程,需要的可以參考一下
    2022-04-04
  • Android實(shí)現(xiàn)一個(gè)簡(jiǎn)單帶動(dòng)畫的展開收起功能

    Android實(shí)現(xiàn)一個(gè)簡(jiǎn)單帶動(dòng)畫的展開收起功能

    今天給大家?guī)?lái)一個(gè)展開和收起的簡(jiǎn)單效果,如果只是代碼中簡(jiǎn)單設(shè)置顯示或隱藏,熟悉安卓系統(tǒng)的朋友都知道,那一定是閃現(xiàn),所以筆者結(jié)合了動(dòng)畫,使得體驗(yàn)效果瞬間提升一個(gè)檔次,感興趣的小伙伴可以自己動(dòng)手試一試
    2023-08-08
  • Ubuntu下android adb環(huán)境變量配置方法

    Ubuntu下android adb環(huán)境變量配置方法

    這篇文章主要介紹了Ubuntu下android adb環(huán)境變量配置方法,本文給出了操作步驟,按步驟操作即可,需要的朋友可以參考下
    2015-04-04
  • android自定義帶箭頭對(duì)話框

    android自定義帶箭頭對(duì)話框

    這篇文章主要為大家詳細(xì)介紹了android自定義帶箭頭對(duì)話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android編程實(shí)現(xiàn)定時(shí)發(fā)短信功能示例

    Android編程實(shí)現(xiàn)定時(shí)發(fā)短信功能示例

    這篇文章主要介紹了Android編程實(shí)現(xiàn)定時(shí)發(fā)短信功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android定時(shí)發(fā)送短信功能的相關(guān)原理、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下
    2017-09-09
  • 詳解EventBus 3.x 的快速使用

    詳解EventBus 3.x 的快速使用

    這篇文章主要介紹了詳解EventBus 3.x 的快速使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論

洛宁县| 永和县| 福鼎市| 大庆市| 蓝山县| 盐津县| 思南县| 万载县| 金湖县| 高邑县| 那曲县| 通州市| 中江县| 和静县| 含山县| 贵定县| 大石桥市| 宣武区| 镇江市| 大邑县| 乌拉特前旗| 井陉县| 紫金县| 昌吉市| 华阴市| 谢通门县| 灵宝市| 全南县| 会理县| 宁明县| 平乐县| 商河县| 苏州市| 尚志市| 德化县| 连云港市| 江陵县| 霍州市| 和田县| 嵩明县| 托克逊县|