Animation位移渐变组合动画了解一下

一:需求分析

最近要实现一个view上下循环滚动的动画,需要带有位置移动和透明度转变的动画。类似于从A到B发生位移动画,且view逐渐显示。而从B到C发生位移动画,且view渐变暗消失。实现效果如图所示:

二:需求拆分

接到这个需求后,首先将需求进行细分,分为位移动画和逐渐变量(变暗)两个部分。对应的Android的动画类分别是TranslateAnimation(位移动画)和AlphaAniamtion(透明度变化动画)。首先先熟悉一下这两种动画。

1:TranslateAnimation 位移动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void startTranslateAnimation() {
/**
* 进行位移动画,标准步骤
* 1. 创建位移动画对象
* 构造函数 TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
* 参数含义:相对于原图位置 fromXDelta X轴起点相对于原图偏移 toXDelta X轴终点相对于原图偏移
* fromYDelta Y轴起点相对于原图偏移 toYDelta Y轴终点相对于原图偏移
* 2. 设置动画终点是否保持 setFillAfter : true 动画结束后留在终点 false:动画结束后返回起点
*/
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 0.0f, 0.0f, -200.0f);
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(1000);

mTextView.startAnimation(translateAnimation);
}

这里需要注意的一个小点:设置FillAfter的值,为true代表动画后View停留在终点位置处,false代表动画结束后返回起点。

2:AlphaAnimation 透明度转变动画

1
2
3
4
5
6
7
8
9
10
11
12
private void startAlphaAnimation() {
/**
* 进行透明度变化动画,标准步骤
* 1. 创建AlphaAnimation动画
* 构造函数 AlphaAnimation fromAlphaVal toAlphaVal
*/
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
alphaAnimation.setFillAfter(true);
alphaAnimation.setDuration(1000);

mTextView.startAnimation(alphaAnimation);
}

3:同时完成位移和透明度动画需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void startAppearanceAnimation() {
/**
* 核心类 AnimationSet 顾名思义,可以简单理解为将多种动画放在一个set集合里面
* 产生渐渐显示+位移动画,将加速小火箭渐渐显示出来;
*
*/
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 0.0f, 0.0f, -200.0f);
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);

AnimationSet animationSet = new AnimationSet(true);
animationSet.setFillAfter(true);
animationSet.setDuration(1000);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(alphaAnimation);

mTextView.startAnimation(animationSet);
}

实现叠加的动画效果:这里一定要注意的是,对AnimationSet动画,fillAfter和duration需要在AniamtionSet对象中设置,不要设置单个动画对象上。

4:完成的动画过程(位移+渐渐显示 停留 位移+渐渐隐藏)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.zm.animationdemo;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

TextView tv_text;
Button btn;
List<String> textList = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = findViewById(R.id.tv_text);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startAppearanceAnimation();
}
});

textList.add("Hello World!");
textList.add("Welcome to my blog!");
textList.add("https://zhangmiao.cc");
textList.add("Knowledge is power.");
textList.add("Learn and live.");
textList.add("可以不成功,但不可以不成长!");
textList.add("加油💪");
}

private void startAppearanceAnimation() {
/**
* 核心类 AnimationSet 顾名思义,可以简单理解为将多种动画放在一个set集合里面
* 产生渐渐显示+位移动画
*
*/
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 0.0f, 0.0f, -50.0f);
AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);

AnimationSet animationSet = new AnimationSet(true);
animationSet.setFillAfter(true);
animationSet.setDuration(1000);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(alphaAnimation);

animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startDisappearanceAnimation();
}
}, 1500);
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});
tv_text.startAnimation(animationSet);
int index = (int) (Math.random() * textList.size());
tv_text.setText(textList.get(index));
}

private void startDisappearanceAnimation() {
TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 0.0f, -50.0f, -100.0f);
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);

AnimationSet animationSet = new AnimationSet(true);
animationSet.setFillAfter(true);
animationSet.setDuration(1000);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(alphaAnimation);
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
startAppearanceAnimation();
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});
tv_text.startAnimation(animationSet);
}

}

总结

  • 位移动画TranslateAnimation实现位移,SetFIllAfter=true可让View停留在动画终点处,false返回动画起点
  • 透明度动画 AlphaAnimation实现透明度变化,可实现View的渐显或者渐隐效果
  • 动画效果可以叠加展示,通过AnimationSet实现。整个动画的fillAfter和duration需要设置在AnimationSet对象上,而不是单个对象单独设置(单独设置不会有效果)
坚持原创技术分享,您的支持将鼓励我继续创作!