Android动画:两大必学动画详解之视图动画(View Animation)

引言

    Android动画分为两类, 分别是视图动画(View Animation)和属性动画(Property Animation)。其中View动画又分为帧动画(Frame Animation)和补间动画(Tween Animation),帧动画可以去加载一系列可绘制的Drawable逐帧实现动画,补间动画可以执行一系列简单的变化,这些变化包括旋转、位移、缩放等等。

1 帧动画(Frame Animation)

    帧动画顾名思义就是由图片按照顺序一帧一帧组合而成的动画。如下图1-1所示,图片按照run_1到run_16播放就可以形成一个跑步的动画。

    Android实现帧动画有两种方式,一种是xml文件实现,这种方式是帧动画最常用的实现方式,另一种是JAVA代码方式实现。它们的本质都是通过使用AnimationDrawable按顺序添加一系列Drawable来创建动画,并把动画赋值给View对象。

图1-1 跑步素材

1.1 xml实现帧动画

    在Drawable下新建文件,然后使用animation-list并嵌套一系列的item,每一个item代表着一帧。

<?xml version="1.0" encoding="utf-8"?>

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="false" >

<!--android:oneshot="false" ,true表示只播放一次,false则相反-->

    <item android:drawable="@drawable/run_1" android:duration="50"></item>

    <item android:drawable="@drawable/run_2" android:duration="50"></item>

    <item android:drawable="@drawable/run_3" android:duration="50"></item>

    <item android:drawable="@drawable/run_4" android:duration="50"></item>

    <item android:drawable="@drawable/run_5" android:duration="50"></item>

    <item android:drawable="@drawable/run_6" android:duration="50"></item>

    <item android:drawable="@drawable/run_7" android:duration="50"></item>

    <item android:drawable="@drawable/run_8" android:duration="50"></item>

    <item android:drawable="@drawable/run_9" android:duration="50"></item>

    <item android:drawable="@drawable/run_10" android:duration="50"></item>

    <item android:drawable="@drawable/run_11" android:duration="50"></item>

    <item android:drawable="@drawable/run_12" android:duration="50"></item>

    <item android:drawable="@drawable/run_13" android:duration="50"></item>

    <item android:drawable="@drawable/run_14" android:duration="50"></item>

    <item android:drawable="@drawable/run_15" android:duration="50"></item>

    <item android:drawable="@drawable/run_16" android:duration="50"></item>

</animation-list>

    下面是核心代码,首先获取AnimationDrawable,然后赋值给iamgeview做背景,最后调用AnimationDrawable的start、stop方法,就可以像图1-2一样开始动画或者停止动画。

//获取动画

animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.run_anim);

img.setImageDrawable(animationDrawable);

//开始播放动画

start.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                if (animationDrawable !=null && !animationDrawable.isRunning()) {

                    animationDrawable.start();

                }

            }

    });

//停止播放动画

 stop.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                if (animationDrawable !=null &&animationDrawable.isRunning()) {

                    animationDrawable.stop();

                }

            }

 });

1.2 JAVA代码实现帧动画

    首先实例化AnimationDrawable,然后再获取Drawable下的资源文件,按照顺序逐帧添加到AnimationDrawable中,最后将AnimationDrawable赋值给View对象使用。

private void createAnimation() {

    animationDrawable =new AnimationDrawable();

    int id;

    for (int i =1; i <=16; i++) {

        id = getResources().getIdentifier("run_" + i,"drawable", getPackageName());

        //根据id获取到Drawable

        Drawable drawable = getResources().getDrawable(id);

        animationDrawable.addFrame(drawable,50);

    }

    //是否只运行一次

    animationDrawable.setOneShot(false);

    //给imageView设置动画

    img.setImageDrawable(animationDrawable);

}


图1-2 Frame Animation 

2 补间动画(Tween Animation

    补间动画是通过执行一系列变化来达到动画效果的,这一系列的变化包括旋转(rotate)、位移(translate)、缩放(scale)和透明度(alpha),对应的类包括 RotateAnimationTranslateAnimationScaleAnimationAlphaAnimationAnimationSet五个类,它们都继承自Animation抽象类。补间动画的实现方式也是两种,第一种是在xml文件中实现,另一种是JAVA代码实现。

    因为对应的五个类继承自Animation,所以它们也继承了Animation的属性,除此之外它们还有自己特有的属性。下列是继承自Animation的属性:

android:duration="long"    //定义动画运行时间,单位:毫秒。

android:fillAfter="boolean"    //定义动画结束后应用动画转变(是否停留在最后一帧)。默认值是false。

android:fillBefore="boolean"    //定义动画开始之前应用动画转变(是否直接从动画转变的第一帧开始)。默认值为true。

android:fillEnaabled="boolean"    //如果为true则应用fillBefore的值,否则忽略fillBefore的值。默认值为false。

android:interpolator="@[+][package:]type/name" | "?[package:]type/name"    //定义动画过渡用的插值器,例如:android:interpolator="@android:anim/linear_interpolator"。

android:repeatCount="int"    //定义动画重复多少次。默认值为0。

android:repeatMode=["restart " | "reverse"]      //定义repeatCount大于0时动画结束时的重复模式,restart 是从开始的地方重新播 放,reverse是从结束的地方重新播放。默认值是restart。

android:startOffset="int"    //定义动画开始前延迟,单位:毫秒。

android:zAdjustment=["bottom" | "normal" | " top"]    //允许调整动画在运行期间的z轴顺序。默认值为normal。

android:detackWallpaper="boolean"    //窗口动画特殊属性,如果这个窗口在壁纸之上,请不要使用它为墙纸设置动画。

2.1 旋转(rotate)

    RotateAnimation是控制对象旋转的动画,这个旋转发生在X-Y平面上。你可以指定旋转的中心点,其中(0,0)是左上角的点,如果你不指定中心点,那么(0,0)就是默认的旋转中心点。

    旋转特有的属性:

android:fromDegrees="float"    //定义动画开始前的角度。

android:toDegrees="float"     //定义动画结束时的角度。

android:pivotX="float"    //定义旋转点的X轴坐标,0是左上角。这个值可以是百分比(旋转坐标在自身x轴的百分比 )或者如果pivotXType 是ABSOLUTE这个值可以是一个绝对数字。

android:pivotY="float"   //定义旋转点的Y轴坐标,0是左上角。这个值可以是百分比( 旋转坐标在自身y轴的百分比 )或者如果 pivotXType 是 ABSOLUTE这个值可以是一个绝对数字。

下面两个属性pivotXType和pivotYType不能在XML中使用,例如使用了pivotXType会报错误“ error: attribute android:pivotXType not found. ”

pivotXType    //指定应该如何去解释pivotXValue ,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。

pivotYType    //指定应该如何去解释 pivotYValue ,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。

Animation.ABSOLUTE    //指定尺寸(dimension)是一个绝对像素数量。使用之后pivotX 或pivotY 的值都是绝对像素数量。

Animation.RELATIVE_TO_SELF       // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X (动画对象的宽 )。

Animation.RELATIVE_TO_PARENT    // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画父对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X ( 动画父对象的宽 )。

2.1.1 在xml中实现旋转

 先看旋转效果图,如下图2-1:

图2-1 旋转xml使用实例

    首先要做的就是在res下新建anim目录,然后在anim目录下创建m_rotate.xml,以rotate作为根元素进行编写,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<rotate xmlns:android="http://schemas.android.com/apk/res/android"

    android:duration="1000"

    android:fromDegrees="0" 

    android:interpolator="@android:anim/accelerate_interpolator" 

    android:pivotX="50%" 

    android:pivotY="50%"    

    android:toDegrees="720"    >

</rotate>

    编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation。

animation = AnimationUtils.loadAnimation(this, R.anim.m_rotate);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {  

         if (animation !=null) {

            img.startAnimation(animation);

          }

      }

});

2.1.2 纯代码实现旋转

    纯代码实现旋转需要使用到RotateAnimation类。RotateAnimation有以下四个构造方法,一般①不常用,使用②③④居多。

①RotateAnimation(Context context, AttributeSet attrs)

②RotateAnimation(float fromDegrees, float toDegrees)

③RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)

④RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

    因为前面没有pivotXType和pivotYType的实例,因此使用④构造RotateAnimation,先看效果图2-2 。

图2-2 pivotXType和pivotYType使用实例

    构造方法很简单,pivotXType使用Animation.RELATIVE_TO_SELF,pivotXValue使用1f,因此动画对象的x轴旋转点从0向右边位移到自身1倍的位置上,而pivotXType也使用Animation.RELATIVE_TO_SELF,但是pivotXValue使用0f,因此Y轴旋转点没变。

animation =new RotateAnimation(0,720, Animation.RELATIVE_TO_SELF,1f, Animation.RELATIVE_TO_SELF,0f);

animation.setDuration(1000);

animation.setInterpolator(this, android.R.anim.accelerate_interpolator);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.2 平移(translate)

    TranslateAnimation是控制对象位置的动画。

    旋转特有的属性:

android:fromXDelta="float"    //在动画改变之前的X轴坐标

android:fromYDelta="float"    //在动画改变之前的X轴坐标

android:toXDelta="float"    //动画改变之后的X轴坐标

android:toYDelta="float"    //动画改编之后的X轴坐标

    下面四个属性 fromXType、 fromYType、toXType、toYType不能在XML中使用,例如使用了fromXType 会报错误“ error: attribute android:pivotXType not found. ”

fromXType//指定应该如何去解释 fromXType,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。

fromYType//指定应该如何去解释 fromYType,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。 

toXType//指定应该如何去解释  toXType,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。 

toYType//指定应该如何去解释  toYType,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。 

Animation.ABSOLUTE  //指定尺寸(dimension)是一个绝对像素数量。使用之后 pivotX 或 pivotY 的值都是绝对像素数量。

Animation.RELATIVE_TO_SELF       // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X ( 动画对象的宽 )。 

Animation.RELATIVE_TO_PARENT // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画父对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X ( 动画父对象的宽 )。

2.2.1 在xml实现平移

    先看平移效果图,如下图2-3:

图2-3 平移xml使用实例

     首先要做的就是在res下新建anim目录,然后在anim目录下创建m_translate.xml,以translate作为根元素进行编写,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<translate xmlns:android="http://schemas.android.com/apk/res/android"

    android:duration="1000"

    android:fromXDelta="0"

    android:fromYDelta="0"

    android:toXDelta="50%"

    android:toYDelta="50%">

</translate>

     编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation。

animation = AnimationUtils.loadAnimation(this, R.anim.m_translate);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.2.2 纯代码实现位移

    纯代码实现旋转需要使用到TranslateAnimation类。TranslateAnimation有以下三个构造方法,一般①不常用,使用②③居多。

①TranslateAnimation(Context context, AttributeSet attrs)

②TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

③TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType,float fromYValue, int toYType, float toYValue)

     因为前面没有fromXType、 fromYType、toXType、toYType的实例,因此使用③构造RotateAnimation,先看效果图2-4 。

图2-4 fromXType、 fromYType、toXType、toYType实例

    构造方法很简单,fromXType使用Animation.RELATIVE_TO_SELF,fromXValue使用1f,因此动画对象x轴的平移距离为自身宽的一倍,fromYType使用Animation.RELATIVE_TO_SELF,toYType使用1f,因此动画对象Y轴的平移距离为自身高的一倍。

animation =new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f, Animation.RELATIVE_TO_SELF,1f,Animation.RELATIVE_TO_SELF,0f, Animation.RELATIVE_TO_SELF,1f);

animation.setDuration(2000);

animation.setInterpolator(this, android.R.anim.linear_interpolator);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.3 缩放(scale)

    ScaleAnimation是控制对象缩放的动画,你可以指定缩放的中心点。

    缩放特有的属性:

android:fromXScale="float"    //动画开始前横轴缩放因子

android:fromYScale="float"    //动画开始前纵轴缩放因子

android:toXScale="float"    //动画结束时横轴缩放因子

android:toYScale="float"    //动画结束时纵轴缩放因子

android:pivotX="float"    //定义缩放点的X轴坐标,0是左上角。这个值可以是百分比(1.0是100% )或者如果pivotXType 是ABSOLUTE这个值可以是一个绝对数字。

android:pivotY="float"   //定义旋转点的Y轴坐标,0是左上角。这个值可以是百分比( 1.0是100%  )或者如果 pivotXType 是 ABSOLUTE这个值可以是一个绝对数字。

    下面两个属性pivotXType和pivotYType不能在XML中使用,例如使用了pivotXType会报错误“ error: attribute android:pivotXType not found. ”

pivotXType    //指定应该如何去解释pivotXValue ,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。

pivotYType    //指定应该如何去解释 pivotYValue ,可以使用其中一个Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF或 Animation.RELATIVE_TO_PARENT。

Animation.ABSOLUTE    //指定尺寸(dimension)是一个绝对像素数量。使用之后pivotX 或pivotY 的值都是绝对像素数量。

Animation.RELATIVE_TO_SELF       // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X (动画对象的宽 )。

Animation.RELATIVE_TO_PARENT    // 指定尺寸(dimension)是一个浮点数,这个浮点数用来乘动画父对象的宽或高。例如使用之后动画最终的x轴 =(pivotX 的值) X ( 动画父对象的宽 )。

2.3.1 在xml实现缩放

    先看看缩放效果图2-5:

图2-5 缩放xml使用实例

    首先要做的就是在res下新建anim目录,然后在anim目录下创建m_scale.xml,以scale作为根元素进行编写,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<scale xmlns:android="http://schemas.android.com/apk/res/android"

    android:duration="1000"

    android:fromXScale="1"

    android:fromYScale="1"

    android:pivotX="50%"

    android:pivotY="50%"

    android:toXScale="2"

    android:toYScale="2">

</scale>

     编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation。

animation = AnimationUtils.loadAnimation(this, R.anim.m_scale);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.3.2 纯代码实现缩放

    纯代码实现旋转需要使用到ScaleAnimation类。ScaleAnimation有以下四个构造方法,一般①不常用,使用②③④居多。

①ScaleAnimation(Context context,AttributeSet attrs)

②ScaleAnimation(float fromX, float toX, float fromY, float toY)

③ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)

④ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue,int pivotYType, float pivotYValue)

  因为前面没有pivotXType和pivotYType的实例,因此使用④构造RotateAnimation,先看效果图2-6 。

图2-6 pivotXType、pivotXType使用实例

 构造方法很简单,fromXScale使用了1f,toXScale使用了2f,所以x轴放大了1倍。fromYScale使用了1f,toYScale使用了1f,所以Y轴没变。pivotXType使用Animation.RELATIVE_TO_SELF,pivotXValue使用0.5f,因此动画对象的x轴缩放点从0向右边位移到自身0.5倍的位置上,而pivotXType也使用Animation.RELATIVE_TO_SELF,但是pivotXValue使用0.5f,因此动画对象的x轴缩放点从0向下边位移到自身0.5倍的位置上。

animation =new ScaleAnimation(1f,2f,1f,1f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);

animation.setDuration(2000);

animation.setInterpolator(this, android.R.anim.linear_interpolator);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.4 透明度(alpha)

    AlphaAnimation是控制对象alpha等级的动画,用于淡入淡出效果。

    透明度特有的属性:

android:fromAlpha="float"    //开始动画alpha值,其中1.0表示完全不透明,0.0表示完全透明

android:toAlpha="float"    //结束动画alpha值。

 2.4.1 xml实现透明度变化

    先看看透明度变化效果图2-7:

图2-7 透明度变化效果图

    首先要做的就是在res下新建anim目录,然后在anim目录下创建m_alpha.xml,以alpha作为根元素进行编写,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"

    android:duration="1000"

    android:fromAlpha="1"

    android:toAlpha="0" />

    编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation。

animation = AnimationUtils.loadAnimation(this, R.anim.m_alpha);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.4.2 纯代码实现透明度变化

    构造方法很简单,只有fromAlpha和toAlpha两个参数,代码效果图和图2-7是一样的。

animation =new AlphaAnimation(1.0f,0.0f);

animation.setDuration(1000);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.5 组合动画

    AnimationSet可以将每一个单一的动画组合而成一个动画。如果AnimationSet设置了子对象的属性,那么子对象的属性就会被AnimationSet覆盖(例如duration或fillBefore)。

    组合动画特有的属性:

android:shareInterpolator="boolean"    //如果为true,所有动画都使用AnimationSet的插值器。否则每个动画使用自己的插值器

    在组合动画中,部分AnimationSet的属性添加到AnimationSet会影响自己,有的属性则下推到子对象去使用,还有的属性会被忽略掉,如下:

duration, repeatMode, fillBefore, fillAfter:当这些属性在AnimationSet对象设置时,将会下推到子对象。

repeatCount, fillEnabled:AnimationSet会忽略掉这些属性

startOffset, shareInterpolator:这些属性将会应用到AnimationSet本身

2.5.1 xml实现组合动画

     先看看组合动画效果图2-8:

图2-8 xml组合动画实例

    首先要做的就是在res下新建anim目录,然后在anim目录下创建m_set.xml,以set作为根元素进行编写,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

    android:fillAfter="true">

    <scale

        android:duration="2000"

        android:fromXScale="1"

        android:fromYScale="1"

        android:pivotX="50%"

        android:pivotY="50%"

        android:toXScale="2"

        android:toYScale="2" />

    <rotate

        android:duration="2000"

        android:fromDegrees="0"

        android:pivotX="50%"

        android:pivotY="50%"

        android:toDegrees="720" />

</set>

     编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation。

animation = AnimationUtils.loadAnimation(this, R.anim.m_set);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2.5.2 纯代码实现组合动画

    纯代码实现旋转需要使用到AnimationSet类。AnimationSet有以下两个个构造方法,一般①不常用,使用②居多。

①AnimationSet(Context context,AttributeSet attrs)

②AnimationSet(boolean shareInterpolator)

     构造方法很简单,只有shareInterpolator一个参数,先创建AnimationSet,然后再使用addAnimation添加动画,我添加的是2.4.1的m_alpha和2.1.1的m_rotate动画,代码如下所示,效果图如图2-9。

animation =new AnimationSet(false);

((AnimationSet)animation).addAnimation(AnimationUtils.loadAnimation(this, R.anim.m_alpha));

((AnimationSet)animation).addAnimation(AnimationUtils.loadAnimation(this, R.anim.m_rotate));

animation.setDuration(2000);

start.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        if (animation !=null) {

            img.startAnimation(animation);

        }

    }

});

2-9 纯代码组合动画实例

2.5.1 fillBefore、fillEnabled的使用

    fillBefore适用于AnimationSet动画,fillBefore在是在动画开始之前应用,但是在AnimationSet启动之前这个属性值不会被应用。

    先说说要实现的效果,第一种效果是先放大,再从原位置的90°旋转到720°,效果图如图2-10,第二种效果是放大的同时先应用旋转第一帧的属性,接着从旋转属性的第一帧开始旋转,效果图如图2-11。

图2-10 第一种效果图
图2-11 第二种效果图

    第一种效果图在xml中的代码如下所示,set 的android:fillBefore="false",scale的 android:fillEnabled="false" ,rotate的android:fillEnabled="true" ,第二章开头说过android:fillBefore是在android:fillEnabled="true"时才会被使用,android:fillBefore=“true”时是在动画开始前应用动画转化(也就是第一帧)。

    第二种效果图只是将 rotate中的fillEnabled设置为flase,也就是android:fillEnabled="false"。

    编写完xml文件后,在java代码中使用AnimationUtils里的loadAnimation方法加载动画,并使用Animation,java代码和2.5.1中的java代码一样。

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

    android:fillBefore="false">

    <scale

        android:duration="1000"

        android:fromXScale="1"

        android:fromYScale="1"

        android:pivotX="50%"

        android:pivotY="50%"

        android:toXScale="2"

        android:toYScale="2"

        android:fillEnabled="false"/>

    <rotate

        android:duration="2000"

        android:fromDegrees="90"

        android:pivotX="50%"

        android:pivotY="50%"

        android:startOffset="1000"

        android:toDegrees="720"

        android:fillEnabled="true" />

</set>   

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容