利用Android實(shí)現(xiàn)一種點(diǎn)贊動(dòng)畫效果的全過(guò)程
前言
最近有個(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ò)ValueAnimator和AnimatorSet來(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)文章希望大家以后多多支持腳本之家!
- Android高級(jí)UI特效仿直播點(diǎn)贊動(dòng)畫效果
- android實(shí)現(xiàn)直播點(diǎn)贊飄心動(dòng)畫效果
- Android控件實(shí)現(xiàn)直播App點(diǎn)贊飄心動(dòng)畫
- Android實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(27)
- Android控件FlowLikeView實(shí)現(xiàn)點(diǎn)贊動(dòng)畫
- Android實(shí)現(xiàn)簡(jiǎn)單點(diǎn)贊動(dòng)畫
- Android實(shí)現(xiàn)仿今日頭條點(diǎn)贊動(dòng)畫效果實(shí)例
相關(guān)文章
andriod開發(fā)之Activity的渲染機(jī)制
本文給大家分享的是在andriod開發(fā)中經(jīng)常需要用到的Activity的渲染機(jī)制的詳細(xì)說(shuō)明,主要是通過(guò)實(shí)例給大家講解Activity是如何畫到屏幕上的,希望大家能夠喜歡2018-03-03
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)樣式
最新小編接到這樣一個(gè)項(xiàng)目,需要在一個(gè)距形卡片上做一個(gè)傾斜的Tag,類似支付寶上的一個(gè)功能,接著小編給大家?guī)?lái)了實(shí)現(xiàn)思路,對(duì)android 傾斜角標(biāo)的實(shí)現(xiàn)方法感興趣的朋友跟隨小編一起看看吧2019-10-10
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)境變量配置方法,本文給出了操作步驟,按步驟操作即可,需要的朋友可以參考下2015-04-04
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

