• 第三部分:Android 应用程序接口指南---第四节:动画和图形---第二章 View动画与Drawable动画


    第2章 View动画与Drawable动画

    2.1 View动画

    你可以使用View的动画系统,在View上执行的补间动画。补间动画进行,如起点,终点,大小,旋转,动画的其他普通法方面的计算。补间动画可以执行一系列简单的View对象的内容转换(位置,大小,旋转,透明度)。所以,如果你有一个TextView的对象,你可以移动,旋转,放大,或缩小文本。如果它有一个背景图片,背景图片将随着文字变形。animation这个包(package)中提供了所有用于补间动画类。定义补间动画所指定的序列可以通过XML或Android代码来定义。推荐使用XML文件来定义一个布局,因为它更具可读性,可重复使用,易修改。在下面的例子中,我们使用XML来定义动画。动画可以指定你想要发生的时间,持续时间,连续或同时播放等。例如,你有一个TextView从左至右移动,然后旋转180度,或者你有一个TextView从左至右移动,并同时旋转。

    动画的XML文件定义在res/anim/文件夹下。该文件必须有一个根元素:<set>

    从下面的XML的ApiDemos之一它是用于拉伸,然后同时缩放和旋转视图对象。如代码清单1-1所示:

    <set android:shareInterpolator="false">
    
        <scale
    
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    
            android:fromXScale="1.0"
    
            android:toXScale="1.4"
    
            android:fromYScale="1.0"
    
            android:toYScale="0.6"
    
            android:pivotX="50%"
    
            android:pivotY="50%"
    
            android:fillAfter="false"
    
            android:duration="700" />
    
        <set android:interpolator="@android:anim/decelerate_interpolator">
    
            <scale
    
               android:fromXScale="1.4"
    
               android:toXScale="0.0"
    
               android:fromYScale="0.6"
    
               android:toYScale="0.0"
    
               android:pivotX="50%"
    
               android:pivotY="50%"
    
               android:startOffset="700"
    
               android:duration="400"
    
               android:fillBefore="false" />
    
            <rotate
    
               android:fromDegrees="0"
    
               android:toDegrees="-45"
    
               android:toYScale="0.0"
    
               android:pivotX="50%"
    
               android:pivotY="50%"
    
               android:startOffset="700"
    
               android:duration="400" />
    
        </set>
    
    </set>

    代码清单1-1

    屏幕坐标(在这个例子中不使用)(0,0)在左上角,并增加向下和右侧。

    一些值,如pivotX,可以指定对象本身或相对于父控件。你想要的东西一定要使用正确的格式(“50”为50%是有区别的, 50%表示相对对象本身)。

    你可以决定如何随着时间的推移应用分配一个加速器(Interpolator)。Android包括几个加速器子类指定不同的速度曲线:例如,AccelerateInterpolator的讲述一个开始减缓和加快转型。每个人都有一个属性值,可以在XML应用。此XML保存在项目res/anim/目录下的hyperspace_jump.xml,下面的代码将引用它,并将其应用于从布局到ImageView的对象。如代码清单1-2所示:

    ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
    
    Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
    
    spaceshipImage.startAnimation(hyperspaceJumpAnimation);

    代码清单1-2

    2.2 Drawable动画

    Drawable动画你可以理解为是帧动画,一般业内我们也叫它帧动画。它让你加载一个系列drawable资源来创建一个动画。就像翻书一样。AnimationDrawable类是帧动画的基础。其实帧动画使用起来很简单。你可以在XML文件中定义你想要的动画序列。如按照下面的格式即可,参考下面代码清单1-3所示:

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:oneshot="true">
    
        <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    
        <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    
        <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
    
    </animation-list>

    代码清单1-3

    这个帧动画只有三帧。并且设置了oneshot=“true”,表示只执行一次,然后会停在最后一帧。当然你设置为false他就会循环运行了。一般我们放在res/anim/目录下,当然有些人也喜欢放在res/drawable/目录下,这都是可以的。这个XML文件会被当成View的background属性来播放。以下代码清单1-4就是一个例子:

    AnimationDrawable rocketAnimation;
    
    public void onCreate(Bundle savedInstanceState) {
    
      super.onCreate(savedInstanceState);
    
      setContentView(R.layout.main);
    
      ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
    
      rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
    
      rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
    
    }
    
    public boolean onTouchEvent(MotionEvent event) {
    
      if (event.getAction() == MotionEvent.ACTION_DOWN) {
    
        rocketAnimation.start();
    
        return true;
    
      }
    
      return super.onTouchEvent(event);
    
    }

    代码清单1-4

    请注意,动画的.start()方法放在onCreate()中是无效的。如果你想要程序自动后就立即播放,你可以考虑重写onWindowFocusChanged() 方法,并把rocketAnimation.start()放在其中即可。

     

  • 相关阅读:
    reset代码
    将博客搬至CSDN
    超简单的JNI——NDK开发教程
    浅谈Backbone的defaults
    为什么NaN !== NaN
    javascript小技巧[转]
    new function()随笔
    小记js中普通function和arrow function内this的使用区别
    evernote出现“Sync failed due to unexpected problem at server side”的问题
    强迫症和拖延症患者如何应对马桶4(遨游Maxthon)“上次未关闭页面”丢失的问题
  • 原文地址:https://www.cnblogs.com/tianjian/p/3487908.html
Copyright © 2020-2023  润新知