Android动画相关

平常用到的一些比较机智的动画

1.ViewCompat

ServiceApp里面看到一个二维码扫描/条形码输入的一个界面,两个界面放在一个Activity里面,切换二维码扫描跟条形码输入的时候会有一个过渡动画,

1.1先设置要做过渡动画的View

ViewCompat.setAlpha(rlBlur, 0);

1.2 在该显示的时候, 设置VISIBLE,(默认应该是GONE)

1
2
3
rlBlur.setVisibility(View.VISIBLE);
rlBlur.setBackground(new BitmapDrawable(null, blurBg));
ViewCompat.animate(rlBlur).alpha(1).setDuration(400).start();

1.3 在不显示的时候是指GONE和透明度

1
2
rlBlur.setVisibility(View.GONE);
ViewCompat.setAlpha(rlBlur, 0);

1.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
switch (v.getId()) {
case R.id.tv_qr_scan:
if (!tvQrScan.isSelected()) {
tvCodeInput.setSelected(false);
tvQrScan.setSelected(true);
ViewCompat.animate(llInput).alpha(0).setDuration(400).setListener(new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
}
@Override
public void onAnimationEnd(View view) {
llInput.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(View view) {
}
}).start();
mQRCodeView.startSpot();
}
break;
case R.id.tv_code_input:
if (!tvCodeInput.isSelected()) {
tvQrScan.setSelected(false);
tvCodeInput.setSelected(true);
ViewCompat.animate(llInput).alpha(1).setDuration(400).setListener(new ViewPropertyAnimatorListener() {
@Override
public void onAnimationStart(View view) {
llInput.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(View view) {
}
@Override
public void onAnimationCancel(View view) {
}
}).start();
mQRCodeView.stopSpot();
}
break;

感觉用起来还不错,有需要可以用这个,在两个VIEW切换的时候用,显得切换不会那么生硬。


2.Activity启动退出动画

2.1.首先在res/anim文件夹下创建进入和退出动画的set

这里以底部上滑出现和从顶部下滑退出为例:
activity_open.xml:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100%p"
android:toYDelta="0"
android:duration="1500"
/>
</set>
:
1
2
3
4
5
6
7
8
9
```xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="25"
android:toYDelta="100%p"
android:duration="1500"
/>
</set>

2.2.设置启动动画:

1
2
3
4
Intent intent = new Intent();
intent.setClassName(cxt,"com.test.mrn.android.route.RouteDemoActivity");//打开一个activity
startActivity(intent);
overridePendingTransition(R.anim.activity_open,0);

2.3.设置关闭动画

1
2
3
4
5
6
7
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
overridePendingTransition(0, R.anim.activity_close);
}
});

3.使用style的方式定义Activity的切换动画

3.1 定义Application的style

1
2
3
4
5
<application android:allowbackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsrtl="true"
android:theme="@style/AppTheme">
</application>

3.2 定义具体的AppTheme样式

其中这里的windowAnimationStyle就是我们定义的Actvity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件。也就是说通过切换Application的style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity跳转配置动画效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowAnimationStyle">@style/activityAnim</item>
</style>
<!-- 使用style方式定义activity切换动画 -->
<style name="activityAnim">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_top</item>
<item name="android:activityOpenExitAnimation">@anim/slide_in_top</item>
</style>

在windowAnimationStyle存在四中动画:

  • activityOpenEnterAnimation
  • activityOpenExitAnimation
  • activityCloseEnterAnimation
  • activityCloseExitAnimation