利用Android实现一种点赞动画效果的全过程

 更新时间:2022年12月06日 10:22:30   作者:ChenYhong  
最近做项目需要实现点赞动画,下面这篇文章主要给大家介绍了关于利用Android实现一种点赞动画效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图:

分析一下这个动画,点击按钮后,拇指首先有个缩放的效果,然后有5个拇指朝不同的方向移动,其中部分有放大的效果。

点击后的缩放效果

本文通过ScaleAnimation 实现缩放效果,代码如下:

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 {
        // 先取消控件当前的动画效果(重复点击时)
        view.clearAnimation()
        // 设置动画的持续时间
        duration = 300
        // 开始播放动画
        view.startAnimation(this)
    }
}

拇指的散开效果

有5个拇指分别往不同的方向移动,本文通过动态添加View,并对View设置动画来实现。可以看到在移动的同时还有缩放的效果,所以需要同时播放几个动画。

本文通过ValueAnimatorAnimatorSet来实现该效果,代码如图:

// 此数组控制动画的效果
// 第一个参数控制X轴移动距离
// 第二个参数控制Y轴移动距离
// 第三个参数控制缩放的倍数(基于原大小)
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) {
                // 创建控件
                val ivThumbUp = AppCompatImageView(context)
                ivThumbUp.setImageResource(R.drawable.icon_thumb_up)
                // 设置与原控件一样的大小
                ivThumbUp.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(25), DensityUtil.dp2Px(25))
                // 先设置为全透明
                ivThumbUp.alpha = 0f
                addView(ivThumbUp)
                // 设置与原控件一样的位置
                ivThumbUp.x = binding.ivThumbUp.x
                ivThumbUp.y = binding.ivThumbUp.y
                AnimatorSet().apply {
                    // 设置动画集开始播放前的延迟
                    startDelay = 330L + index * 50L
                    // 设置动画监听
                    addListener(object : Animator.AnimatorListener {
                        override fun onAnimationStart(animation: Animator) {
                            // 开始播放时把控件设置为不透明
                            ivThumbUp.alpha = 1f
                        }

                        override fun onAnimationEnd(animation: Animator) {
                            // 播放结束后再次设置为透明,并从根布局中移除
                            ivThumbUp.alpha = 0f
                            ivThumbUp.clearAnimation()
                            ivThumbUp.post { removeView(ivThumbUp) }
                        }

                        override fun onAnimationCancel(animation: Animator) {}

                        override fun onAnimationRepeat(animation: Animator) {}
                    })
                    // 设置三个动画同时播放
                    playTogether(
                        // 缩放动画
                        ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                            duration = 700
                            // 设置插值器,速度一开始快,快结束时减慢
                            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 {
            // 先取消控件当前的动画效果(重复点击时)
            binding.ivThumbUp.clearAnimation()
            // 设置动画的持续时间
            duration = 300
            // 开始播放动画
            binding.ivThumbUp.startAnimation(this)
        }
    }

    private fun playDiffusionAnimator() {
        for (index in 0 until 5) {
            binding.root.run {
                if (this is ViewGroup) {
                    // 创建控件
                    val ivThumbUp = AppCompatImageView(context)
                    ivThumbUp.setImageResource(R.drawable.icon_thumb_up)
                    // 设置与原控件一样的大小
                    ivThumbUp.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(25), DensityUtil.dp2Px(25))
                    // 先设置为全透明
                    ivThumbUp.alpha = 0f
                    addView(ivThumbUp)
                    // 设置与原控件一样的位置
                    ivThumbUp.x = binding.ivThumbUp.x
                    ivThumbUp.y = binding.ivThumbUp.y
                    AnimatorSet().apply {
                        // 设置动画集开始播放前的延迟
                        startDelay = 330L + index * 50L
                        // 设置动画监听
                        addListener(object : Animator.AnimatorListener {
                            override fun onAnimationStart(animation: Animator) {
                                // 开始播放时把控件设置为不透明
                                ivThumbUp.alpha = 1f
                            }

                            override fun onAnimationEnd(animation: Animator) {
                                // 播放结束后再次设置为透明,并从根布局中移除
                                ivThumbUp.alpha = 0f
                                ivThumbUp.clearAnimation()
                                ivThumbUp.post { removeView(ivThumbUp) }
                            }

                            override fun onAnimationCancel(animation: Animator) {}

                            override fun onAnimationRepeat(animation: Animator) {}
                        })
                        // 设置三个动画同时播放
                        playTogether(
                            // 缩放动画
                            ValueAnimator.ofFloat(1f, animatorConfig[index][2]).apply {
                                duration = 700
                                // 设置插值器,速度一开始快,快结束时减缓
                                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()
                }
            }
        }
    }
}

效果如图:

个人感觉还原度还是可以的哈哈。

总结

到此这篇关于利用Android实现一种点赞动画效果的文章就介绍到这了,更多相关Android点赞动画实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android多渠道打包总结(推荐)

    Android多渠道打包总结(推荐)

    多渠道打包一般应用于向不同应用市场提交app后用来统计不同渠道下载量等一些信息,这篇文章主要介绍了Android多渠道打包总结,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • Android Service的启动过程分析

    Android Service的启动过程分析

    这篇文章主要介绍了Android Service的启动过程分析的相关资料,需要的朋友可以参考下
    2017-04-04
  • adb通过wifi连接android设备流程解析

    adb通过wifi连接android设备流程解析

    这篇文章主要介绍了adb通过wifi连接android设备流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 浅析Android.mk

    浅析Android.mk

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范
    2016-01-01
  • Android UI设计系列之自定义EditText实现带清除功能的输入框(3)

    Android UI设计系列之自定义EditText实现带清除功能的输入框(3)

    这篇文章主要介绍了Android UI设计系列之自定义EditText实现带清除功能的输入框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android 动画之RotateAnimation应用详解

    Android 动画之RotateAnimation应用详解

    本节讲解旋转动画效果RotateAnimation方法的应用,有需要的朋友可以参考下
    2012-12-12
  • 基于Android实现的文件同步设计方案

    基于Android实现的文件同步设计方案

    随着用户对自身数据保护意识的加强,让用户自己维护自己的数据也成了独立开发产品时的一个卖点,若只针对少量的文件进行同步,则实现起来比较简单,当针对一个多层级目录同步时,情况就复杂多了,本文我分享下我的设计思路
    2023-10-10
  • android编程实现设置、打开wifi热点共享供他人连接的方法

    android编程实现设置、打开wifi热点共享供他人连接的方法

    这篇文章主要介绍了android编程实现设置、打开wifi热点共享供他人连接的方法,涉及Android创建WiFi及设置共享的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • gradle中的properties文件详解

    gradle中的properties文件详解

    这篇文章主要介绍了gradle中的properties文件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Android应用开发中触摸屏手势识别的实现方法解析

    Android应用开发中触摸屏手势识别的实现方法解析

    这篇文章主要介绍了Android应用开发中触摸屏手势识别的实现方法解析,深入的部分则是对左右手势的识别给出了相关编写思路,需要的朋友可以参考下
    2016-02-02

最新评论