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

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

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

前言

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

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

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

本文通過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)前的動畫效果(重復(fù)點(diǎn)擊時)
        view.clearAnimation()
        // 設(shè)置動畫的持續(xù)時間
        duration = 300
        // 開始播放動畫
        view.startAnimation(this)
    }
}

拇指的散開效果

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

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

// 此數(shù)組控制動畫的效果
// 第一個參數(shù)控制X軸移動距離
// 第二個參數(shù)控制Y軸移動距離
// 第三個參數(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è)置動畫集開始播放前的延遲
                    startDelay = 330L + index * 50L
                    // 設(shè)置動畫監(jiān)聽
                    addListener(object : Animator.AnimatorListener {
                        override fun onAnimationStart(animation: Animator) {
                            // 開始播放時把控件設(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è)置三個動畫同時播放
                    playTogether(
                        // 縮放動畫
                        ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                            duration = 700
                            // 設(shè)置插值器,速度一開始快,快結(jié)束時減慢
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                 (values.animatedValue as Float).let { value ->
                                    ivThumbUp.scaleX = value
                                    ivThumbUp.scaleY = value
                                }
                            }
                        },
                        // X軸的移動動畫
                        ValueAnimator.ofFloat(ivThumbUp.x, ivThumbUp.x + animatorConfig[index][0]).apply {
                            duration = 700
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                ivThumbUp.x = values.animatedValue as Float
                            }
                        },
                        // Y軸的移動動畫
                        ValueAnimator.ofFloat(ivThumbUp.y, ivThumbUp.y + animatorConfig[index][1]).apply {
                            duration = 700
                            interpolator = DecelerateInterpolator()
                            addUpdateListener { values ->
                                ivThumbUp.y = values.animatedValue as Float
                            }
                        })
                }.start()
            }
        }
    }
}

示例

整合之后做了個示例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)前的動畫效果(重復(fù)點(diǎn)擊時)
            binding.ivThumbUp.clearAnimation()
            // 設(shè)置動畫的持續(xù)時間
            duration = 300
            // 開始播放動畫
            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è)置動畫集開始播放前的延遲
                        startDelay = 330L + index * 50L
                        // 設(shè)置動畫監(jiān)聽
                        addListener(object : Animator.AnimatorListener {
                            override fun onAnimationStart(animation: Animator) {
                                // 開始播放時把控件設(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è)置三個動畫同時播放
                        playTogether(
                            // 縮放動畫
                            ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                                duration = 700
                                // 設(shè)置插值器,速度一開始快,快結(jié)束時減緩
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    (values.animatedValue as Float).let { value ->
                                        ivThumbUp.scaleX = value
                                        ivThumbUp.scaleY = value
                                    }
                                }
                            },
                            // Y軸的移動動畫
                            ValueAnimator.ofFloat(ivThumbUp.x, ivThumbUp.x + animatorConfig[index][0]).apply {
                                duration = 700
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    ivThumbUp.x = values.animatedValue as Float
                                }
                            },
                            // X軸的移動動畫
                            ValueAnimator.ofFloat(ivThumbUp.y, ivThumbUp.y + animatorConfig[index][1]).apply {
                                duration = 700
                                interpolator = DecelerateInterpolator()
                                addUpdateListener { values ->
                                    ivThumbUp.y = values.animatedValue as Float
                                }
                            })
                    }.start()
                }
            }
        }
    }
}

效果如圖:

個人感覺還原度還是可以的哈哈。

總結(jié)

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

相關(guān)文章

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

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

    本文給大家分享的是在andriod開發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說明,主要是通過實(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)廣播圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android實(shí)現(xiàn)傾斜角標(biāo)樣式

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

    最新小編接到這樣一個項目,需要在一個距形卡片上做一個傾斜的Tag,類似支付寶上的一個功能,接著小編給大家?guī)砹藢?shí)現(xiàn)思路,對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的一個思路和過程,需要的可以參考一下
    2022-04-04
  • Android實(shí)現(xiàn)一個簡單帶動畫的展開收起功能

    Android實(shí)現(xiàn)一個簡單帶動畫的展開收起功能

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

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

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

    android自定義帶箭頭對話框

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

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

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

    詳解EventBus 3.x 的快速使用

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

最新評論

射阳县| 黑水县| 镇宁| 政和县| 靖江市| 陵川县| 从化市| 深水埗区| 云南省| 阳谷县| 独山县| 遂平县| 阳江市| 莱阳市| 盐源县| 昂仁县| 星子县| 伊春市| 长汀县| 博罗县| 阜新市| 报价| 桓仁| 曲水县| 谷城县| 夏津县| 石屏县| 疏勒县| 乐清市| 邻水| 灌阳县| 牟定县| 运城市| 堆龙德庆县| 新民市| 宿松县| 将乐县| 祥云县| 新和县| 合川市| 淮滨县|