欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

动画Animation

程序员文章站 2022-03-01 21:05:21
...

Android的三种动画,即:
•View Animation(视图动画)
•Drawable Animation(帧动画)
•Property Animation(属性动画)
Drawable Animation(帧动画):
2.1帧动画概述
帧动画是顺序播放一组预先定义好的图片,不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画。
2.2帧动画的使用

    必须是根节点,包含一个或者多个元素,属性有:
    android:oneshot true代表只执行一次,false循环执行。
    类似一帧的动画资源。
    animation-list的子项,包含属性如下:
    android:drawable 一个frame的Drawable资源。
    android:duration 一个frame显示多长时间。
    帧动画如果帧数过多容易引起OOM
    //资源
    animationDrawable = (AnimationDrawable) main_img.getBackground();
    animationDrawable.start();
    123
    View动画的概述及种类
    视图动画的作用对象是View,支持四种动画效果,分别是平移动画,缩放动画,旋转动画,透明度动画。譬如,我们可以对TextView设置其文本的移动,旋转,缩放,透明。
    视图动画可以通过XML或通过代码动态创建,对于视图动画建议使用XML文件定义,因为它具有更高的可读性,可重用性。

    要使用View动画,首先要创建XML文件,我们需要在res下新建anim文件夹,接着在anim下创建animation resource file的xml文件,我们举例为view_anim.xml
    我们通过xml文件来了解它们各自的语法:
    1<?xml version="1.0" encoding="utf-8"?>
    2<set

3 xmlns:android=“http://schemas.android.com/apk/res/android”>
4
5 <translate
6 android:fromXDelta=“0%p”
7 android:toXDelta=“20%p”
8 android:fromYDelta=“0%p”
9 android:toYDelta=“20%p”
10 android:duration=“4000”/>
11
12 <scale
13 android:fromXScale=“1.0”
14 android:toXScale=“0.2”
15 android:fromYScale=“1.0”
16 android:toYScale=“0.2”
17 android:pivotX=“50%”
18 android:pivotY=“50%”
19 android:duration=“4000”/>
20
21 <rotate
22 android:fromDegrees=“0”
23 android:toDegrees=“360”
24 android:pivotX=“50%”
25 android:pivotY=“50%”
26 android:duration=“4000”/>
27
28 <alpha
29 android:fromAlpha=“1.0”
30 android:toAlpha=“0.2”
31 android:duration=“4000”/>
32

    123456789101112131415161718192021222324252627282930313233
    从上面的代码我们知道,View动画既可以是单个动画,也可以有一系列动画组成。
    这是因为View动画的四种种类分别对应着Animation的四个子类(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation),除了以上四个子类它还有一个AnimationSet类,对应xml标签为,它是一个容器,可以包含若干个动画,并且内部也可以继续嵌套集合的。
    我们在activity对TextView设置动画:
    6public class MainActivity extends AppCompatActivity {

7

    8    private TextView textView;

9

    10    @Override

11 protected void onCreate(Bundle savedInstanceState) {
12 super.onCreate(savedInstanceState);
13 setContentView(R.layout.activity_main);
14

    15        textView = findViewById(R.id.textview);
    16        textView.setOnClickListener(new View.OnClickListener() {

17 @Override
18 public void onClick(View v) {
19 Animation animation = AnimationUtils.loadAnimation(MainActivity.this,R.anim.viewanimation);
20 textView.startAnimation(animation);
21 }
22 });
23

    24    }

25}

12345678910111213141516171819202122232425
动画监听
为了实现一些需求,如动画结束后开始另一个动画或者页面跳转,这时候就需要监听动画。
1 Animation.addListener(new AnimatorListener() {
2 @Override
3 public void onAnimationStart(Animation animation) {
4 //动画开始时执行
5 }
6

    7           @Override

8 public void onAnimationRepeat(Animation animation) {
9 //动画重复时执行
10 }
11

    12         @Override

13 public void onAnimationCancel()(Animation animation) {
14 //动画取消时执行
15 }
16

    17          @Override

18 public void onAnimationEnd(Animation animation) {
19 //动画结束时执行
20 }
21 });

    12345678910111213141516171819202122232425
    xml属性Java方法说明
    android:detachWallpaper setDetachWallpaper(boolean)是否在壁纸上运行
    android:duration setDuration(long)动画的运行时间(以毫秒为单位);必须设置
    android:fillAfter setFillAfter(boolean)动画结束时是否保持动画最后的状态;默认为false,优先于fillBefore
    android:fillBefore setFillBefore(boolean)动画结束时是否还原到开始动画前的状态;默认为true
    android:fillEnabled setFillEnabled(boolean)是否应用fillBefore的值,对fillAfter无影响;默认为true
    android:interpolator setInterpolator(Interpolator)设定插值器(指定的动画效果,譬如回弹等)android:repeatCount setRepeatCount(int)重复次数
    android:repeatMode setRepeatMode(int)重复类型有两个值,reverse表示倒序回放,restart表示从头播放
    android:startOffset setStartOffset(long)调用start函数之后等待开始运行的时间,单位为毫秒android:zAdjustment setZAdjustment(int)表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
    属性动画:
    属性动画可以看作是增强版的补间动画,与补间动画的不同之处体现在:
    •补间动画只能定义两个关键帧在透明、旋转、位移和倾斜这四个属性的变换,但是属性动画可以定义任何属性的变化。
    •补间动画只能对 UI 组件执行动画,但属性动画可以对任何对象执行动画。
    与补间动画类似的是,属性动画也需要定义几个方面的属性:
    •动画持续时间。默认为 300ms,可以通过 android:duration 属性指定。
    •动画插值方式。通过 android:interploator 指定。
    •动画重复次数。通过 android:repeatCount 指定。
    •重复行为。通过 android:repeatMode 指定。
    •动画集。在属性资源文件中通过 <set …/> 来组合。
    •帧刷新率。指定多长时间播放一帧。默认为 10 ms。
    属性动画 API
    •Animator: 提供创建属性动画的基类,基本不会直接使用这个类。
    •ValueAnimator:属性动画用到的主要的时间引擎,负责计算各个帧的属性值。
    •ObjectAnimator: ValueAnimator 的子类,对指定对象的属性执行动画。
    •AnimatorSet:Animator 的子类,用于组合多个 Animator。
    除了这些 API,属性动画还提供了一个 Evaluator ,用来控制属性动画如何计算属性值。
    •IntEvaluator:计算 int 类型属性值的计算器。
    •FloatEvaluator: 用于计算 float 类型属性值的计算器。
    •ArgbEvaluator: 用于计算十六进制形式表示的颜色值的计算器。
    •TypeEvaluator: 可以自定义计算器。
    使用 ValueAnimator 创建动画的步骤:
    •调用 ValueAnimator 的 ofInt()、ofFloat() 或者 ofObject() 静态方法创建 ValueAnimator 实例。
    •调用 ValueAnimator 的 setXxx() 等方法设置持续时间,插值方式、重复次数等。
    •调用 ValueAnimator 的 start() 方法启动动画。
    •为 ValueAnimator 注册 AnimatorUpdateListener 监听器,在该监听器中可以监听 ValueAnimator 计算出来的值改变,并将这些值应用到指定对象上。
    属性动画的一般使用:
    定义属性动画和补间动画等类似,有两种方式:
    •使用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
    •使用资源文件来定义动画。
    属性动画的使用:
    •创建 ValueAnimator 或 ObjectAnimator 对象 —— 即可以从 XML 资源文件加载该动画也可以直接调用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
    •根据需要为 Animator 对象设置属性。
    •如果需要监听 Animator 的动画开始事件,动画结束事件、动画重复事件、动画值改变事件,并根据事件提供响应处理代码,需要为Animator 对象设置监听器。
    •如果有多个动画需要同时播放,需要使用 AnimatorSet 组合这些动画。
    •调用 Animator 对象的 start 启动动画。


    1public void onViewClicked() {
    2        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(bawei,"alpha",0,1);
    3        ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(bawei,"rotation",0,360,180,360,150,0);
    4        ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(bawei,"scaleX",1,3,1,2,1);
    5        ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(bawei,"scaleY",1,3,1,2,1);
    6        AnimatorSet ans= new AnimatorSet();
    7

    8//        ans.playSequentially(objectAnimator,objectAnimator2,objectAnimator3);
    9        ans.play(objectAnimator).with(objectAnimator2).before(objectAnimator3).with(objectAnimator4);
    10//        第一个参数用于指定这个动画要操作的是哪个控件
    11//                第二个参数用于指定这个动画要操作这个控件的哪个属性
    12//        //1、透明度:alpha
    13//        public void setAlpha(float alpha)
    14//
    15////2、旋转度数:rotation、rotationX、rotationY
    16//        public void setRotation(float rotation)
    17//        public void setRotationX(float rotationX)
    18//        public void setRotationY(float rotationY)
    19//
    20////3、平移:translationX、translationY
    21//        public void setTranslationX(float translationX)
    22//        public void setTranslationY(float translationY)
    23//
    24////缩放:scaleX、scaleY
    25//        public void setScaleX(float scaleX)
    26//        public void setScaleY(float scaleY)
    27

    28//        第三个参数是可变长参数,这个就跟ValueAnimator中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪。
    29      //无线循环
    objectAnimator1.setRepeatCount(-1);
    //时间
    30        ans.setDuration(6000);
    31        ans.setInterpolator(new DecelerateInterpolator());//差值器
    32        ans.start();
    33    }