zoukankan      html  css  js  c++  java
  • 第三部分: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()放在其中即可。

     

  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/tianjian/p/3487908.html
Copyright © 2011-2022 走看看