前言
最近项目里面遇到一个需要在多个地方展示气泡提醒的动画,效果大概如下图

要求动画执行时机从小三角符号处开始执行,由下向上变大,动画效果包括scaleX、scaleY、alpha,起初想过用PopUpWindow从底部弹出来,利用showAsDropDown,加上动画效果。但在实际操作中由于会在列表中使用,当item滑动时pop的显示位置也会动,所以最后可以自定义一个用path绘制三角箭头的TextView。
动画部分
最开始打算就是直接使用属性动画ViewPropertyAnimator,比如
view.scaleX = fromValue
view.scaleY = fromValue
view.alpha = fromValue
view.animate()
.scaleX(toValue)
.scaleY(toValue)
.alpha(toValue)
.setInterpolator(LinearInterpolator())
.duration = duration
但是发现View动画执行的开始的位置始终都在View的中心点,达不到UI想要的效果,经过反复尝试后想到在写View动画时,我们在anim文件中都会这么写:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:duration="600">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="65%"
android:pivotY="80%"
/>
<alpha
android:interpolator="@android:anim/linear_interpolator"
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
经常写动画的人可能会注意到pivotX和pivotY两个属性,其实也就是动画执行的X和Y坐标,其值可以是50、50%、50%p,50是指View左上角坐标加50px;50%指当前View的左上角加上当前View宽高的50%做为初始点;50%p表示以当前View的左上角加上父控件宽高的50%做为初始点。所View动画的这两个属性可以控制动画执行的初始位置,正好可以解决我的问题,但我在属性动画中该如何使用呢?抱着试一试的心态,写了如下代码:
view.pivotX = view.width * pivotX
view.pivotY = view.height * pivotY
view.scaleX = fromValue
view.scaleY = fromValue
view.alpha = fromValue
view.animate()
.scaleX(toValue)
.scaleY(toValue)
.alpha(toValue)
.setInterpolator(LinearInterpolator())
.duration = duration
果然,问题解决! 费了一番功夫,还是自己太菜了!!!