目录补间动画RotateAnimation动画示例ScaleAnimation动画示例TranslateAnimation动画示例AlphaAnimation动画示例Animatio
Android
常用的四种补间动画分别为RotateAnimation
、ScaleAnimation
、TranslateAnimation
、AlphaAnimation
,他们的父类为Animation
,UML
类图如下:
父类通用方法有:
setFillEnabled
设置的值。durationMillis < 0
会抛异常。RESTART
:正序重新开始、REVERSE
:倒序重新开始,默认是RESTART
。注意:repeatCount(count)
设置的count
值必须>0
或者是INFINITE
才会生效0
,则动画只播放一次;如果设置为N(N>0)
,则将继续播放N
次;如果设置为INFINITE
,则将无限轮播。默认为0
。AccelerateDecelerateInterpolator
。AnimationListener
中的几个方法如下:animation.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationEnd(animation: Animation?) {
//动画结束时回调,注意:当repeatCount设置为Animation.INFINITE不再收到该回调
log("onAnimationEnd")
}
override fun onAnimationStart(animation: Animation?) {
//动画开始时回调
log("onAnimationStart")
}
override fun onAnimationRepeat(animation: Animation?) {
//repeatCount设置为Animation.INFINITE时动画每执行一次该方法回调就会执行一次
log("onAnimationRepeat")
}
})
旋转动画,通过设置目标View
的旋转中心、旋转角度来达到旋转目的。RotateAnimation
中需要特殊设置的几个参数如下:
// RotateAnimation.java
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
int pivotYType, float pivotYValue) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mPivotXValue = pivotXValue;
mPivotXType = pivotXType;
mPivotYValue = pivotYValue;
mPivotYType = pivotYType;
initializePivotPoint();
}
X轴
计量类型,可以设置成Animation.ABSOLUTE
、Animation.RELATIVE_TO_SELF
、Animation.RELATIVE_TO_PARENT
之一,pivotXType
与pivotXValue
组合之后可以表示不同的X轴
坐标点。Animation.ABSOLUTE:目标View的X轴坐标 = View左上角的原点 + pivotXValue数值的点(y方向同理)
Animation.RELATIVE_TO_SELF:目标View的X轴坐标 = View左上角的原点 + View自身宽度 * pivotXValue数值
Animation.RELATIVE_TO_PARENT:目标View的X轴坐标 = View左上角的原点 + View父控件宽度 * pivotXValue
View
所围绕的点的X坐标
。如果pivotXType
为absolute
,此值可以是一个绝对数字,否则可以是一个0.1f~1.0f 的值。pivotXType
,表示的的是y轴pivotXValue
,表示的的是y轴方式一:代码动态创建
val rotateAnim: Animation = RotateAnimation(
0f,
360f,
Animation.RELATIVE_TO_SELF,
0.5f,
Animation.RELATIVE_TO_SELF,
0.5f
)
rotateAnim.duration = 2000
rotateAnim.repeatCount = Animation.INFINITE
rotateAnim.interpolator = LinearInterpolator()
rotateAnim.fillAfter = true
mTvTarget.animation = rotateAnim
方式二:XML
中设置
//view_rotate.xml中:
<rotate xmlns:android="Http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="restart"
android:toDegrees="360" />
代码中引用:
mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_rotate))
执行效果:
在XML中设置pivotX、pivotY时注意:pivotX pivotY,可取值为数字,百分比,或者百分比p
10
,那么中心坐标为View
的左上角的原点在x方向
和y方向
加上10px
的点。对应代码中的Animation.ABSOLUTE
单位。View
的左上角的原点在x方向
加上自身宽度50%和y方向
自身高度50%的点(即自身中间的位置)。对应代码中的Animation.RELATIVE_TO_SELF
。p
时(如50%p
),中心坐标为View
的左上角的原点在x方向
加上父控件宽度50%和y方向
父控件高度50%的点。对应代码中的Animation.RELATIVE_TO_PARENT
缩放动画,设置的参数如下:
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
mResources = null;
mFromX = fromX;
mToX = toX;
mFromY = fromY;
mToY = toY;
mPivotXValue = pivotXValue;
mPivotXType = pivotXType;
mPivotYValue = pivotYValue;
mPivotYType = pivotYType;
initializePivotPoint();
}
X轴
方向在动画开始时、结束时对应的缩放因子Y轴
方向在动画开始时、结束时对应的缩放因子pivotXType、pivotXValue、pivotYType、pivotYValue
具体含义在上面的RotateAnimation
已经讲到,这四个值在ScaleAnimation
主要是用来确定缩放中心的。方式一:代码动态创建
val scaleAnim = ScaleAnimation(
1.0f, 0.5f, 1.0f, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f).apply {
duration = 1000
repeatCount = Animation.INFINITE
repeatMode = Animation.REVERSE
fillAfter = true
}
mTvTarget.animation = scaleAnim
方式二:XML
中创建
// view_scale.xml
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toXScale="0.5"
android:toYScale="0.5" />
代码中引入:
mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_scale))
执行结果:
平移动画,是指对目标View
进行平移操作。
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
mFromXValue = fromXDelta;
mToXValue = toXDelta;
mFromYValue = fromYDelta;
mToYValue = toYDelta;
mFromXType = ABSOLUTE;
mToXType = ABSOLUTE;
mFromYType = ABSOLUTE;
mToYType = ABSOLUTE;
}
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
int fromYType, float fromYValue, int toYType, float toYValue) {
mFromXValue = fromXValue;
mToXValue = toXValue;
mFromYValue = fromYValue;
mToYValue = toYValue;
mFromXType = fromXType;
mToXType = toXType;
mFromYType = fromYType;
mToYType = toYType;
}
可以看到有两个不同的构造方法:
ABSOLUTE
,那么传入的float fromXDelta, float toXDelta, float fromYDelta, float toYDelta
都为固定数值,即(fromXDelta, fromYDelta)
、(toXDelta、toYDelta)
分别代表起始坐标与结束坐标。Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT
的一种,那么对应的fromXValue、toXValue、fromYValue、toYValue
可以是具体数值或或者0.0~1.0
(表示目标View
本身或着父View
的百分比)。方式一:代码动态创建
val translateAnim = TranslateAnimation(
Animation.ABSOLUTE, 0f, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.ABSOLUTE, 0f, Animation.RELATIVE_TO_SELF, 0.5f)
.apply {
duration = 2000
fillAfter = false
interpolator = LinearInterpolator()
repeatMode = Animation.REVERSE
repeatCount = Animation.INFINITE
}
mTvTarget.animation = translateAnim
方式二:XML中创建
// view_translate.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toXDelta="50%"
android:toYDelta="50%" />
代码中引入:
mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_translate))
执行效果:
透明度动画
public AlphaAnimation(float fromAlpha, float toAlpha) {
mFromAlpha = fromAlpha;
mToAlpha = toAlpha;
}
方式一:代码动态创建
val alphaAnim = AlphaAnimation(1.0f, 0.2f).apply {
duration = 1000
fillAfter = true
interpolator = LinearInterpolator()
repeatMode = Animation.REVERSE
repeatCount = Animation.INFINITE
}
mTvTarget.animation = alphaAnim
方式二:XML中创建
//view_alpha.xml
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:interpolator="@android:anim/linear_interpolator"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toAlpha="0.0" />
代码中引入:
mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_alpha))
执行效果:
动画组合AnimationSet
,本身也继承自Animation
,可以将多个动画组合起来使用。如下属性在AnimationSet
中设置时的注意事项:
AnimationSet
对象上设置这些属性时,将被下推到所有子动画。AnimationSet
中被忽略。AnimationSet
本身。方式1:代码动态生成
private fun loadAnimSet(): Animation {
//方式1:代码动态生成
val rotateAnim = loadRotationAnim()
val alphaAnim = loadAlphaAnimation()
val translateAnim = loadTranslateAnimation()
val scaleAnim = loadScaleAnimation()
val animSet = AnimationSet(true).apply {
duration = 3000
interpolator = LinearInterpolator()
fillAfter = true
repeatMode = Animation.REVERSE
startOffset = 100 //延迟执行动画,应用于AnimationSet本身
}
//animSet.cancel() //取消动画
//animSet.reset() //重置动画
animSet.addAnimation(rotateAnim)
animSet.addAnimation(alphaAnim)
animSet.addAnimation(translateAnim)
animSet.addAnimation(scaleAnim)
return animSet
}
mTvTarget.startAnimation(loadAnimSet())
方式2:通过XML
创建:
//view_animation_set.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true"
android:fillBefore="false"
android:interpolator="@android:anim/linear_interpolator"
android:repeatMode="reverse"
android:shareInterpolator="true">
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:toDegrees="360" />
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:toXScale="0.5"
android:toYScale="0.5" />
<!-- startOffset:延迟执行动画-->
<set
android:fillAfter="true"
android:interpolator="@android:anim/linear_interpolator"
android:repeatMode="reverse"
android:shareInterpolator="true"
android:startOffset="100">
<alpha
android:fromAlpha="1.0"
android:repeatCount="infinite"
android:toAlpha="0.0" />
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:repeatCount="infinite"
android:toXDelta="50%"
android:toYDelta="50%" />
</set>
</set>
代码中引入:
mTvTarget.startAnimation(AnimationUtils.loadAnimation(this, R.anim.view_animation_set))
执行结果:
以上就是Android 补间动画及组合AnimationSet常用方法详解的详细内容,更多关于Android 补间动画组合AnimationSet的资料请关注编程网其它相关文章!
--结束END--
本文标题: Android 补间动画及组合AnimationSet常用方法详解
本文链接: https://lsjlt.com/news/170522.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0