企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 7.1.1 View动画的种类 View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation,如表7-1所示。这四种动画既可以通过XML来定义,也可以通过代码来动态创建,对于View动画来说,建议采用XML来定义动画,这是因为XML格式的动画可读性更好。 表7-1 View动画的四种变换 [插图] 要使用View动画,首先要创建动画的XML文件,这个文件的路径为:res/anim/filename. xml。View动画的描述文件是有固定的语法的,如下所示。 <? xml version="1.0" encoding="utf-8"? > <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... </set> </set> 从上面的语法可以看出,View动画既可以是单个动画,也可以由一系列动画组成。 `<set>`标签表示动画集合,对应AnimationSet类,它可以包含若干个动画,并且它的内部也是可以嵌套其他动画集合的,它的两个属性的含义如下: android:interpolator 表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。这个属性可以不指定,默认为@android:anim/accelerate_decelerate_interpolator,即加速减速插值器,关于插值器的概念会在7.3.2节中进行具体介绍。 android:shareInterpolator 表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或者使用默认值。 `<translate>`标签标示平移动画,对应TranslateAnimation类,它可以使一个View在水平和竖直方向完成平移的动画效果,它的一系列属性的含义如下: * · android:fromXDelta——表示x的起始值,比如0; * · android:toXDelta——表示x的结束值,比如100; * · android:fromYDelta——表示y的起始值; * · android:toYDelta——表示y的结束值。 `<scale>`标签表示缩放动画,对应ScaleAnimation,它可以使View具有放大或者缩小的动画效果,它的一系列属性的含义如下: * · android:fromXScale——水平方向缩放的起始值,比如0.5; * · android:toXScale——水平方向缩放的结束值,比如1.2; * · android:fromYScale——竖直方向缩放的起始值; * · android:toYScale——竖直方向缩放的起始值; * · android:pivotX——缩放的轴点的x坐标,它会影响缩放的效果; * · android:pivotY——缩放的轴点的y坐标,它会影响缩放的效果。 在`<scale>`标签中提到了轴点的概念,这里举个例子,默认情况下轴点是View的中心点,这个时候在水平方向进行缩放的话会导致View向左右两个方向同时进行缩放,但是如果把轴点设为View的右边界,那么View就只会向左边进行缩放,反之则向右边进行缩放,具体效果读者可以自己测试一下。 `<rotate>`标签表示旋转动画,对于RotateAnimation,它可以使View具有旋转的动画效果,它的属性的含义如下: * · android:fromDegrees——旋转开始的角度,比如0; * · android:toDegrees——旋转结束的角度,比如180; * · android:pivotX——旋转的轴点的x坐标; * · android:pivotY——旋转的轴点的y坐标。 在旋转动画中也有轴点的概念,它也会影响到旋转的具体效果。在旋转动画中,轴点扮演着旋转轴的角色,即View是围绕着轴点进行旋转的,默认情况下轴点为View的中心点。考虑一种情况,View围绕着自己的中心点和围绕着自己的左上角旋转90度显然是不同的旋转轨迹,不同轴点对旋转效果的影响读者可以自己测试一下。 `<alpha>`标签表示透明度动画,对应AlphaAnimation,它可以改变View的透明度,它的属性的含义如下: * · android:fromAlpha——表示透明度的起始值,比如0.1; * · android:toAlpha——表示透明度的结束值,比如1。 上面简单介绍了View动画的XML格式,具体的使用方法查看相关文档。除了上面介绍的属性以外,View动画还有一些常用的属性,如下所示。 * · android:duration——动画的持续时间; * · android:fillAfter——动画结束以后View是否停留在结束位置,true表示View停留在结束位置,false则不停留。 下面是一个实际的例子: // res/anim/animation_test.xml <? xml version="1.0" encoding="utf-8"? > <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:zAdjustment="normal" > <translate android:duration="100" android:fromXDelta="0" android:fromYDelta="0" android:interpolator="@android:anim/linear_interpolator" android:toXDelta="100" android:toYDelta="100" /> <rotate android:duration="400" android:fromDegrees="0" android:toDegrees="90" /> </set> 如何应用上面的动画呢?也很简单,如下所示。 Button mButton = (Button) findViewById(R.id.button1); Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_ test); mButton.startAnimation(animation); 除了在XML中定义动画外,还可以通过代码来应用动画,这里举个例子,如下所示。 AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1); alphaAnimation.setDuration(300); mButton.startAnimation(alphaAnimation); 在上面的代码中,创建了一个透明度动画,将一个Button的透明度在300ms内由0变为1,其他类型的View动画也可以通过代码来创建,这里就不做介绍了。另外,通过Animation的setAnimationListener方法可以给View动画添加过程监听,接口如下所示。从接口的定义可以很清楚地看出每个方法的含义。 public static interface AnimationListener { void onAnimationStart(Animation animation); void onAnimationEnd(Animation animation); void onAnimationRepeat(Animation animation); }