利用Android實現(xià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 {
// 先取消控件當前的動畫效果(重復點擊時)
view.clearAnimation()
// 設置動畫的持續(xù)時間
duration = 300
// 開始播放動畫
view.startAnimation(this)
}
}拇指的散開效果
有5個拇指分別往不同的方向移動,本文通過動態(tài)添加View,并對View設置動畫來實現(xiàn)。可以看到在移動的同時還有縮放的效果,所以需要同時播放幾個動畫。
本文通過ValueAnimator和AnimatorSet來實現(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)
// 設置與原控件一樣的大小
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
// 設置動畫監(jiān)聽
addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {
// 開始播放時把控件設置為不透明
ivThumbUp.alpha = 1f
}
override fun onAnimationEnd(animation: Animator) {
// 播放結(jié)束后再次設置為透明,并從根布局中移除
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
// 設置插值器,速度一開始快,快結(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 {
// 先取消控件當前的動畫效果(重復點擊時)
binding.ivThumbUp.clearAnimation()
// 設置動畫的持續(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)
// 設置與原控件一樣的大小
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
// 設置動畫監(jiān)聽
addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {
// 開始播放時把控件設置為不透明
ivThumbUp.alpha = 1f
}
override fun onAnimationEnd(animation: Animator) {
// 播放結(jié)束后再次設置為透明,并從根布局中移除
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
// 設置插值器,速度一開始快,快結(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使用MulticastSocket實現(xiàn)多點廣播圖片
這篇文章主要為大家詳細介紹了Android使用MulticastSocket實現(xiàn)多點廣播圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
Ubuntu下android adb環(huán)境變量配置方法
這篇文章主要介紹了Ubuntu下android adb環(huán)境變量配置方法,本文給出了操作步驟,按步驟操作即可,需要的朋友可以參考下2015-04-04
Android編程實現(xiàn)定時發(fā)短信功能示例
這篇文章主要介紹了Android編程實現(xiàn)定時發(fā)短信功能,結(jié)合實例形式較為詳細的分析了Android定時發(fā)送短信功能的相關(guān)原理、實現(xiàn)方法與注意事項,需要的朋友可以參考下2017-09-09

