Android中的动画有哪几类?它们的特点和区别?

Android中的动画大致可以分为以下几类:

1. View动画(Tween Animation):View动画是针对View对象进行动画操作的一种动画类型,可以让View对象在一定时间内,由一个状态渐变到另一个状态。该动画主要通过移动、缩放、旋转、透明度等来控制View的动画效果。View动画采用补间动画(Tween Animation)实现,因此又叫做补间动画。

2. 帧动画(Frame Animation):帧动画是指通过一系列预先定义好的图像帧来实现动画效果。将所有的帧图像存放在同一个文件中,在动画播放时,逐帧播放其中的每一帧,并将其绘制到屏幕上。 帧动画特点是易于实现,适用于简单的动画效果,但是会占用大量的空间。

3. 属性动画(Property Animation):属性动画是基于Java语言的反射机制,通过改变对象的属性值来实现动画效果。通过对对象的属性进行变化,可以实现更加丰富多彩的动效,例如:渐变、旋转、缩放、平移等。属性动画可以通过代码和XML来定义动画,同时也支持动画组合以及定义插值器等功能。

4. 转场动画(Transitions Animation):转场动画是指在两个Activity或者两个Fragment之间,通过动画的效果来实现平滑的过渡。转场动画可以通过设置共享元素、设置场景动画等方式来实现。转场动画具有较好的用户体验和视觉效果。

不同的动画类型具有不同的特点和使用场景。View动画适用于简单的动画效果,帧动画适用于简单的动画效果且资源量小,属性动画在实现动画效果上更加丰富,而转场动画适用于Activity或者Fragment之间的平滑过渡。开发者应选择合适的动画类型来实现所需的动画效果。

以下是各种动画的简单实例代码:

1. View动画(Tween Animation)的实例代码:

通过代码实现:

```java
Animation animation = AnimationUtils.loadAnimation(context, R.anim.animation); 
view.startAnimation(animation);
```

通过XML实现:

在res/anim文件夹中,新建animation.xml文件,定义以下内容:

```xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    >
    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        />
    <translate
        android:duration="2000"
        android:fromXDelta="-50%"
        android:toXDelta="0%"
        />
</set>
```
在代码中加载该动画:

```java
Animation animation = AnimationUtils.loadAnimation(context, R.anim.animation); 
view.startAnimation(animation);
```

2. 帧动画(Frame Animation)的实例代码:

通过代码实现:

```java
ImageView imageView = findViewById(R.id.iv_frame_animation);
imageView.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable drawable = (AnimationDrawable) imageView.getBackground();
drawable.start();
```

通过XML实现:

在res/drawable文件夹中,新建frame_animation.xml文件,定义以下内容:

```xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
   <item android:drawable="@drawable/frame1" android:duration="200" />
   <item android:drawable="@drawable/frame2" android:duration="200" />
   <item android:drawable="@drawable/frame3" android:duration="200" />
   <item android:drawable="@drawable/frame4" android:duration="200" />
</animation-list>
```
在ImageView中加载该动画:

```xml
<ImageView
     android:id="@+id/iv_frame_animation"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="@drawable/frame_animation" />
```

3. 属性动画(Property Animation)的实例代码:

通过代码实现:

```java
ObjectAnimator.ofFloat(view, "alpha", 0f, 1f).setDuration(2000).start();
ObjectAnimator.ofFloat(view, "translationX", -view.getWidth(), 0).setDuration(2000).start();
```

通过XML实现:

在res/anim文件夹中,新建animation.xml文件,定义以下内容:

```xml
<objectAnimator
    android:propertyName="alpha"
    android:duration="2000"
    android:valueFrom="0.0"
    android:valueTo="1.0" />
<objectAnimator
    android:propertyName="translationX"
    android:duration="2000"
    android:valueTo="0"
    android:valueFrom="-50%p"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
```

在代码中加载该动画:

```java
AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(context, R.anim.animation);
animatorSet.setTarget(view);
animatorSet.start();
```

4. 转场动画(Transitions Animation)的实例代码:

通过代码实现:

```java
ChangeBounds changeBounds = new ChangeBounds();
changeBounds.setDuration(3000);
TransitionManager.beginDelayedTransition(transitionContainer, changeBounds);

// change view
ViewGroup.LayoutParams params = targetView.getLayoutParams();
params.width *= 2;
targetView.setLayoutParams(params);
```

通过XML实现:

在res/transition文件夹中,新建transition.xml文件,定义以下内容:

```xml
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds android:duration="3000" />
</transitionSet>
```

在代码中加载该动画:

```java
ViewTransition viewTransition = (ViewTransition)TransitionInflater.from(context).inflateTransition(R.transition.transition);
viewTransition.addTarget(view);
TransitionManager.go(viewTransition);
```

猜你喜欢

转载自blog.csdn.net/qq_41878758/article/details/130941364