• 使用(Drawable)资源———AnimationDrawable资源


           AnimationDrawable代表一个动画。

           下面以补间动画为例来介绍如何定义AnimationDrawable资源,定义补间动画的XML资源文件已<set.../>元素作为根元素,该元素可以指定如下4个元素:

    • alpha:设置透明度的改变。
    • scale:设置图片进行缩放改变。
    • translate:设置图片进行位移变换。
    • roate:设置图片进行旋转。    

            定义动画的XML资源应该放在/res/anmi/路径下,当使用ADT创建一个Android应用时默认不会包含该路径,开发者需要自行创建该路径。

            定义补间动画的思路很简单:设置一张图片的开始状态(包括透明度、位置、缩放比、旋转度)、并设置该图片的结束状态(包括透明度、位置、缩放比、旋转度),再设置动画的持续时间,Android系统会使用动画效果把这张图片从开始状态变换到结束状态。

            设置补间动画的语法格式如下:

            

    <?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"]
         android:duration="持续时间">
         <alpha android:fromAlpha="float"
             android:toAlpha="float"/>
         <!-- 定义缩放变换 -->
         <scale android:fromXScale="flaot"
             android:toXScale="flaot"
             android:fromYScale="flaot"
             android:toYScale="flaot"
             android:pivotX="flaot"
             android:pivotY="flaot"
           />
         <!-- 定义为移变换 -->
         <translate android:fromXDelta="flaot"
             android:toXDelta="flaot"
             android:fromYDelta="flaot"
             android:toYDelta="flaot"
             />
         <rotate android:fromDegrees="float"
             android:toDegrees="float"
             android:pivotX="float"
             android:pivotY="float"/>
    
    </set>

    上面的语法格式中包含了大量的fromXxx、toXxx属性,这些属性就用于定义图片的开始状态、结束状态。除此之外,当进行缩放变换(scale)、旋转(roate)变换时,还需要指定如下pivotX、pivotY两个属性,这两个属性用于指定变换的“中心点”——比如进行旋转变换时,需要指定“旋轴点”;进行缩放变换时需要指定“中心点”。

         除此之外,上面<set.../>、<alpha.../>、<scale.../>、<translate.../>、<rotate.../>都可指定一个android:interpolator属性,该属性指定动画的变化速度,可实现匀速、正加速、负加速、无规则变加速等,Android系统的R.anim类中包含了大致常量,它们定义了不同的动画速度,例如:

    • linear_interpolator:匀速变换。
    • accelerate_interpolator:加速变换。
    • decelerate_interpolator:减速变换。  

         如果程序想让<set.../>元素下所有的变换效果使用相同的动画加速,则可指定android:shareInterpolator="true"。

         例如下面的资源文件定义了一个动画资源。

        程序清单文件: esanimmy_anim.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:interpolator="@android:anim/linear_interpolator"
         android:shareInterpolator="true"
         android:duration="5000">
         <!-- 定义缩放变换 -->
         <scale android:fromXScale="1.0"
             android:toXScale="1.4"
             android:fromYScale="1.0"
             android:toYScale="0.6"
             android:pivotX="50%"
             android:pivotY="50%"
             android:fillAfter="true"
             android:duration="2000"/>
         <!-- 定义为移变换 -->
         <translate android:fromXDelta="10"
             android:toXDelta="130"
             android:fromYDelta="30"
             android:toYDelta="-80"
             android:duration="2000"/>
    </set>

    上面的动画资源文件十分简单,它只指定了图片资源需要进行两种变换:缩放变化和位移变换。

        一旦定义了上面的动画资源文件,接下来就可以在XML文件中按如下语法格式来访问它。

        @[<package>.]R.anim.<file_name>

        为了在Java代码中获取实际的Animation对象,则可调用AnimationUtils的如下方法:

    • loadAnimation(Context ctx,int resId)   

        下面的程序示范了如何使用AnimationDrawable资源。

    界面布局文件如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
         >
      <ImageView  android:id="@+id/image"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:src="@drawable/java"
        />
       <Button android:id="@+id/bn"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="开始动画"/>
    
    </LinearLayout>

    后台代码文件如下:

    package com.example.studyresources;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.animation.Animation;
    import android.view.animation.AnimationUtils;
    import android.widget.Button;
    import android.widget.ImageView;
    
    public class AnimationDrawableTest extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_animation_drawable_test);
            final ImageView image=(ImageView)findViewById(R.id.image);
            //加载动画资源
            final  Animation anim=AnimationUtils.loadAnimation(this,R.anim.my_anim);
            //设置动画结束后,保留结束状态
            anim.setFillAfter(true);//①
            Button bn=(Button)findViewById(R.id.bn);
            bn.setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //开始动画
                    image.startAnimation(anim);
                }});
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.animation_drawable_test, menu);
            return true;
        }
    
    }

     上面的程序使用了界面布局中的两个组件:一个ImageView、一个Button,这是两个最普通的组件。运行上面的程序,将看到如图6.7所示的动画效果。

     

    上面的程序中①号代码设置动画结束后保留图片的变换结果。本来Android的API文档中说明可以在<alpha.../>、<scale.../>、<translate.../>、<rotate.../>等元素中指定android:fillAfter为true来实现这个效果,但实际上要为<set.../>设置android:fillAfter为true才可以。

  • 相关阅读:
    51Nod-1013 3的幂的和【快速模幂+逆元】
    51Nod-1082 与7无关的数【进制+打表】
    51Nod-1080 两个数的平方和【暴力法】
    51Nod-1015 水仙花数【进制+查表搜索】
    51Nod-1003 阶乘后面0的数量【分析思维】
    51Nod-1002 数塔取数问题【DP】
    51Nod-1179 最大的最大公约数【暴力】
    51Nod-1018 排序【排序】
    51Nod-1126 求递推序列的第N项【递推序列+模除】
    51Nod-1031 骨牌覆盖【递推】
  • 原文地址:https://www.cnblogs.com/wolipengbo/p/3439000.html
Copyright © 2020-2023  润新知