现在的位置: 首页 > 综合 > 正文

Android属性动画—Property Animation(七)

2013年07月08日 ⁄ 综合 ⁄ 共 2475字 ⁄ 字号 评论关闭

使用插补器

插补器定义了怎样在动画内指定用于时间函数的计算值。例如,指定贯穿整个动画期间的线性播放动画,意味在动画整个时间里都是均匀的移动,也能够指定非线性动画,如:在动画的开始或结尾部分使用加速或减速的动画。

在动画系统中的插补器会接收一个来自Animator对象的一个比例,它代表了动画已经过去的时间。插补器修改这个比例,使它与提供的目标动画类型相吻合。Android系统在android.view.animation包中提供了一组共通的插补器。如果这个包中没有适合你需要的,你可以实现TimeInterpolator接口来创建自己的插补器。

例如,以下是对AccelerateDecelerateInterpolatorLinearInterpolator插补器如何计算插补比例的比较。LinearInterpolator对延时比例没有影响,AccelerateDecelerateInterpolator会让动画加速进入,并减速退出。以下是这些插补器方法中定义的逻辑:

AccelerateDecelerateInterpolator

public float getInterpolation(float input) {

   
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

}

LinearInterpolator

public float getInterpolation(float input) {

   
return input;

}

下表列出了一个持续1000毫秒的动画通过插补器所计算的近似值:

播放时间(毫秒)

播放比例/插值比例(线性)

插值比例(加速/减速)

0

0

0

200

0.2

0.1

400

0.4

0.345

600

0.6

0.8

800

0.8

0.9

1000

1

1

如上表所示,LinearInterpolator插补器的计算结果是匀速变化的,每200毫秒增加0.2AccelerateDecelerateInterpolator插补器的计算结果在200毫秒到600毫秒之间比LinearInterpolator的计算结果要快,而在600毫秒到1000毫秒之间则比LinearInterpolator的计算结果要慢。

关键帧

有时间和值构成的Keyframe对象会定义动画在特定的时间点上特定的状态。每个关键帧还有它自己的插补器来控制当前关键帧与前一个关键帧之间的动画行为。

要实例化一个Keyframe对象,必须使用以下工厂方法之一:ofInt()ofFloat()、或ofObject()。使用这些工厂方法来获取对应类型的关键帧,然后调用ofKeyframe工厂方法来获取一个PropertyValuesHolder对象,一旦获得了这个对象,就能够得到一个在PropertyValuesHolder对象中传递的动画制作器对象。以下代码演示了如何做这件事情:

Keyframe kf0 = Keyframe.ofFloat(0f, 0f);

Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);

Keyframe kf2 = Keyframe.ofFloat(1f, 0f);

PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);

ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)

rotationAnim.setDuration(5000ms);

关于如何使用关键帧的完整的示例,情况APIDemo中的MultiPropertyAnimation示例。

http://developer.android.com/tools/samples/index.html

制作View动画

属性动画系统允许对View对象的动画进行简化处理,并且在视图动画系统上提供了一些优点。视图动画系统通过改变View对象的绘制方式来转换View对象。这种变换是在在每个View对象的容器中来处理的,因为View对象本身没有执行这种处理的属性。这种处理会导致View对象产生动画效果,但却不会改变View对象自身。这样即使在屏幕的不同的位置上绘制了View对象,该对象依然会保留在它的原始位置上。在Android3.0中,添加了新的属性和对象的gettersetter方法,来消除这一缺陷。

属性动画系统能够通过改变View对象中的实际属性,让View对象在屏幕上展现动画效果。另外,View对象也会自动的调用invalidate()方法,在属性发生变化时来属性屏幕。在View类中便于动画设置的新属性有:

1. translationXtranslationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。

2. rotationrotationXrotationY:这三个属性控制View对象围绕支点进行2D3D旋转。

3. scaleXscaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。

4. pivotXpivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。

5. xy:这是两个简单实用的属性,它描述了View对象在它的容器中的最终位置,它是最初的左上角坐标和translationXtranslationY值的累计和。

6. alpha:它表示View对象的alpha透明度。默认值是1(不透明),0代表完全透明(不可见)。

要让一个View对象的属性具有动画效果,如它的颜色或旋转值等,就需要创建一个属性动画制作器,并给对象属性指定想要的动画效果,如:

ObjectAnimator.ofFloat(myView,"rotation",0f,360f);

抱歉!评论已关闭.