Android: Resource Type Animation

概述:Animation Resource 动画资源, 可以定义两种动画类型。 一种是: Property Animation (属性动画), 这是通过改变一个对象的属性值,产生的动画效果。 

 另一种是: View Animation (视图动画) , 这类动画里面又包含了两种动画效果。

1. Tween Animation:通过改变一张图片的 样式,产生的动画效果。

2. Frame Animation:通过多张图片的有序显示达到的动画效果。(就像电影一样, 一帧一帧的播放效果)。


Property Animation (属性动画): 

定义在xml中的动画, 通过修改目标对象的属性值, 比如  background color or alpha。

文件位置: res/animator/filename.xml

资源指向:  ValueAnimatorObjectAnimator, or AnimatorSet.

引用方式: 1. 在java中:R.animator.filename.xml。 2. 在xml中:@[package:]animator/filename.xml

<set
  android:ordering=["together" | "sequentially"]>

    <objectAnimator
        android:propertyName="string"
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <animator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>

文件必须有一个根节点, <set>, <objectAnimation>, <valueAnimator>。 <set>下面可以包含<set>。

下面是每个节点和属性的解释:

<set>:

其他动画属性的容器,  <set>, <objectAnimation>, <valueAnimator>,  代表了AnimatorSet类。

android:ordering

关键字,有两个选项:1. sequentially, 表示按照集合队列播放动画。 2. together,表示所有效果一起进行。


<objectAnimator>:

android:propertyName

String类型, Required (必须要有这个属性)。 在代码中需要通过这个属性引用。比如你可以为一个TextView或者ImageView设置一个backgroudColor属性,和alpha属性在xml文件中。但是属性动画是不能在xml中设置的,只能在java代码中引用,先inflate这个动画xml资源文件, 然后调用loadAnimator()和setTarget()方法为一个对象设置属性动画。

android:valueTo

float, int, or color。Required。

android:valueFrom

float, int, or color.

android:duration

持续的毫秒数。

android:startOffset

start()方法调用之后, 等待的毫秒数。举例: 这个值写1000, 表示start()方法调用后, 1秒后再执行这个节点下的属性变化。

android:repeatCount

动画重复的次数。

android:repeatMode

动画重复的模式。

android:valueType

关键字。有两个选项。 1. intType。 2. floatType。

<animator>

这个节点下面的属性, 基本和上面的无差别。


实例:

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher" />

</LinearLayout>

属性动画文件: 这个文件要建在 res/animator 文件下, 如果你的res下没有这个文件夹,你要新建一个名为animator的文件夹。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">

    <set>
        <objectAnimator
            android:duration="5000"
            android:propertyName="x"
            android:valueTo="400"
            android:valueType="intType" />

        <objectAnimator
            android:duration="5000"
            android:propertyName="y"
            android:valueTo="300"
            android:valueType="intType" />
    </set>

    <objectAnimator
        android:duration="5000"
        android:propertyName="alpha"
        android:valueTo="0f" />
</set>

java代码中使用:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_property);

    ImageView image = (ImageView) findViewById(R.id.imageView);

    AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.simple_animator);
    set.setTarget(image);
    set.start();
}

效果图:




View Animation (视图动画) :

1. Tween Animation:

文件位置: res/anim/filename.xml

文件指向: Animation类。

引用方式: 1. 在java中, R.anim.filename。 2. 在xml中, @[package:]anim/filename

<?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>

<set>

根节点, 子节点包含<alpha>, <scale>, <translate>, <rotate>, <set>。代表了AnimationSet类。

android:interpolator

interpolator 资源。

android:shareInterpolator

boolean类型。

<alpha>

淡入和淡出资源, 代表AlphaAnimation类。

android:fromAlpha

float类型, 取值从0.0到1.0, 0.0表示完全透明, 1.0表示完全不透明。

android:toAlpha

float类型, 取值从0.0到1.0, 0.0表示完全透明, 1.0表示完全不透明。

<scale>

表示缩放, 代表ScaleAnimation。

android:fromXScale

float类型,表示x轴上的改变。 1.0表示没变化。

android:toXScale

float类型,表示x轴上的改变。 1.0表示没变化。

android:fromYScale

float类型,表示y轴上的改变。 1.0表示没变化。

android:toYScale

float类型,表示x轴上的改变。 1.0表示没变化。

android:pivotX

中心轴的x点

android:pivotY

中心轴的y点。

<translate>

水平方向或者垂直方向上的移动。

android:fromXDelta

float类型或者百分比。比如 5, 5%, 5p%

android:toXDelta

float类型或者百分比。比如 5, 5%, 5p%

android:fromYDelta

float类型或者百分比。比如 5, 5%, 5p%

android:toYDelta

float类型或者百分比。比如 5, 5%, 5p%

<rotate>

旋转, 代表RotateAnimation

android:fromDegrees

float类型, 起始角度。

android:toDegrees

float类型, 结束角度。

android:pivotX

float类型或者百分比 中心轴的x

android:pivotY

float类型或者百分比 中心轴的y

实例:

主布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@mipmap/ic_launcher" />

</LinearLayout>

动画资源文件: 这个文件是放在 res/anim文件夹下面

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:repeatMode="restart"
    android:shareInterpolator="false">

    <scale
        android:duration="5000"
        android:fillAfter="false"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.4"
        android:toYScale="0.6" />
    
    <set
        android:interpolator="@android:anim/accelerate_interpolator"
        android:startOffset="5000">

        <scale
            android:duration="2000"
            android:fromXScale="1.4"
            android:fromYScale="0.6"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="0.0"
            android:toYScale="0.0" />

        <rotate
            android:duration="2000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="-45"
            android:toYScale="0.0" />
    </set>
</set>

java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tween_animation);

    ImageView imageView = (ImageView) findViewById(R.id.imageView);

    Animation animation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
    if (imageView != null) {
        imageView.setAnimation(animation);
    } else {
        throw new AssertionError();
    }
}

效果图:



Frame Animation(帧动画):

文件位置:res/drawable/filename.xml

资源指向:AnimationDrawable类。

引用方式:1. 在java中, R.drawable.filename。 2. 在xml中, @[package:]drawable.filename 这里在xml中引用后面不是 "/" 而是 "." 。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>

<animation-list>

根节点。必须的。

android:oneshot

boolean类型, 是否只播放一次。

<item>

必须是<animation-list>的子节点

android:drawable

drawable资源。

android:duration

持续的毫秒数。

实例:

主布局xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

帧动画资源文件:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item
        android:drawable="@mipmap/images1"
        android:duration="1000" />
    <item
        android:drawable="@mipmap/images2"
        android:duration="1000" />
    <item
        android:drawable="@mipmap/images3"
        android:duration="1000" />
    <item
        android:drawable="@mipmap/images4"
        android:duration="1000" />
    <item
        android:drawable="@mipmap/images5"
        android:duration="1000" />
</animation-list>

java代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_frame);

    ImageView image = (ImageView) findViewById(R.id.imageView);

    assert image != null;
    image.setBackgroundResource(R.drawable.grils);

    AnimationDrawable animation = (AnimationDrawable) image.getBackground();
    animation.start();
}

效果图:




好了, 今天的动画基本就这些了。

猜你喜欢

转载自blog.csdn.net/u011326269/article/details/51811447
今日推荐