一、补间动画的基本介绍
补间动画分为AlphaAnimation(淡入淡出),ScaleAnimation(缩放动画),TranslateAnimation(平移),RotateAnimation(旋转)。
补间动画只能作用于View,且对View进行的只是显示效果的改变,并不是改变它的属性。
同时我们也要知道系统对view的坐标是如何定义的
二、在xml中设置补间动画
这里我们要在res下建一个anim目录再在这个目录下建Animation Resource File一个
1、AlphaAnimation(淡入淡出)
这里是指从原本的View中开始,到0.0代表完全淡出。
这里的duration是设置动画时间长短,也可以不在xml中设置。到时候在具体实现代码中设置也行
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration = "500">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration= "2000"
/>
</set>
2、ScaleAnimation(缩放动画)
fromXScale是指沿着X轴起始缩放的比例
fromYScale是指沿着Y轴起始缩放的比例
toXScale是指沿着X轴结束缩放的比例
toXScale是指沿着X轴结束缩放的比例
pivotX是指缩放的中轴点的X坐标
pivotX是指缩放的中轴点的X坐标
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.2"
android:toXScale="1.5"
android:fromYScale="0.2"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration = "2000"/>
</set>
3、TranslateAnimation(平移)
从下到上平移上来:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration = "500">
<translate
android:fromYDelta="100%"
android:toYDelta="0%"/>
</set>
从左向右平移进来:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration = "500">
<translate
android:fromXDelta="-100%"
android:toXDelta="0%"/>
</set>
4、RotateAnimation(旋转)
fromDegrees是旋转的起始角度
toDegrees是结束旋转的角度
repeatCount是旋转的次数,默认值为0,代表一次,假如是其他值,比如3,则旋转4次 另外,值为-1或者infinite时,表示动画永不停止
repeatMode是重复模式,如果repeatCount>0或者为-1或infinte才有效
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:repeatCount = "1"
android:repeatMode = "restart"
android:duration = "2000"/>
</set>
5、组合动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:shareInterpolator="true" >
<scale
android:duration="2000"
android:fromXScale="0.2"
android:fromYScale="0.2"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5" />
<rotate
android:duration="1000"
android:fromDegrees="0"
android:repeatCount="1"
android:repeatMode="reverse"
android:toDegrees="360" />
<translate
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="320"
android:toYDelta="0" />
<alpha
android:duration="2000"
android:fromAlpha="1.0"
android:toAlpha="0.1" />
</set>
三、具体的代码示例:
1、基本的运用
淡入淡出
val mAnimation = AnimationUtils.loadAnimation(this.requireContext(),R.anim.alpha_animation)
binding.imageView.setOnClickListener {
it.startAnimation(mAnimation)
}
}
组合:
val mAnimation = AnimationUtils.loadAnimation(this.requireContext(),R.anim.animations)
binding.imageView.setOnClickListener {
it.startAnimation(mAnimation)
}
}
2、基于fragment切换时的动画组合:
fun Fragment.navigateTo(
target: Fragment,
enterAnim: Int = R.anim.enter_from_right,
exitAnim: Int = R.anim.exit_to_left,
popEnter:Int = R.anim.pop_enter_from_left,
popExit: Int = R.anim.pop_exit_to_right,
addToStack:Boolean=true
){
parentFragmentManager.commit {
//设置动画
setCustomAnimations(enterAnim,exitAnim,popEnter,popExit )
//切换图片
replace(R.id.fragmentContainerView, target)
setReorderingAllowed(true)
if (addToStack){ //是否入栈
addToBackStack(null)
}
}
}