欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

點擊后的縮放效果

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

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

拇指的散開效果

有5個拇指分別往不同的方向移動,本文通過動態(tài)添加View,并對View設(shè)置動畫來實現(xiàn)。可以看到在移動的同時還有縮放的效果,所以需要同時播放幾個動畫。

本文通過ValueAnimatorAnimatorSet來實現(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倍,以控件的中心為原點進行縮放
        ScaleAnimation(1f, 2f, 1f, 2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f).run {
            // 先取消控件當(dāng)前的動畫效果(重復(fù)點擊時)
            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實現(xiàn)一種點贊動畫效果的文章就介紹到這了,更多相關(guān)Android點贊動畫實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android多渠道打包總結(jié)(推薦)

    Android多渠道打包總結(jié)(推薦)

    多渠道打包一般應(yīng)用于向不同應(yīng)用市場提交app后用來統(tǒng)計不同渠道下載量等一些信息,這篇文章主要介紹了Android多渠道打包總結(jié),非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Android Service的啟動過程分析

    Android Service的啟動過程分析

    這篇文章主要介紹了Android Service的啟動過程分析的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • adb通過wifi連接android設(shè)備流程解析

    adb通過wifi連接android設(shè)備流程解析

    這篇文章主要介紹了adb通過wifi連接android設(shè)備流程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • 淺析Android.mk

    淺析Android.mk

    Android.mk是Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫文件等。要掌握jni,就必須熟練掌握Android.mk的語法規(guī)范
    2016-01-01
  • Android UI設(shè)計系列之自定義EditText實現(xiàn)帶清除功能的輸入框(3)

    Android UI設(shè)計系列之自定義EditText實現(xiàn)帶清除功能的輸入框(3)

    這篇文章主要介紹了Android UI設(shè)計系列之自定義EditText實現(xiàn)帶清除功能的輸入框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android 動畫之RotateAnimation應(yīng)用詳解

    Android 動畫之RotateAnimation應(yīng)用詳解

    本節(jié)講解旋轉(zhuǎn)動畫效果RotateAnimation方法的應(yīng)用,有需要的朋友可以參考下
    2012-12-12
  • 基于Android實現(xiàn)的文件同步設(shè)計方案

    基于Android實現(xiàn)的文件同步設(shè)計方案

    隨著用戶對自身數(shù)據(jù)保護意識的加強,讓用戶自己維護自己的數(shù)據(jù)也成了獨立開發(fā)產(chǎn)品時的一個賣點,若只針對少量的文件進行同步,則實現(xiàn)起來比較簡單,當(dāng)針對一個多層級目錄同步時,情況就復(fù)雜多了,本文我分享下我的設(shè)計思路
    2023-10-10
  • android編程實現(xiàn)設(shè)置、打開wifi熱點共享供他人連接的方法

    android編程實現(xiàn)設(shè)置、打開wifi熱點共享供他人連接的方法

    這篇文章主要介紹了android編程實現(xiàn)設(shè)置、打開wifi熱點共享供他人連接的方法,涉及Android創(chuàng)建WiFi及設(shè)置共享的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • gradle中的properties文件詳解

    gradle中的properties文件詳解

    這篇文章主要介紹了gradle中的properties文件詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Android應(yīng)用開發(fā)中觸摸屏手勢識別的實現(xiàn)方法解析

    Android應(yīng)用開發(fā)中觸摸屏手勢識別的實現(xiàn)方法解析

    這篇文章主要介紹了Android應(yīng)用開發(fā)中觸摸屏手勢識別的實現(xiàn)方法解析,深入的部分則是對左右手勢的識別給出了相關(guān)編寫思路,需要的朋友可以參考下
    2016-02-02

最新評論