您的位置:首页 > 移动开发 > Android开发

Android 属性动画

2016-07-12 15:31 423 查看

Android 属性动画

属性动画就是,动画的执行类来设置动画操作的对象的属性、持续时间,开始和结束的属性值,时间差值等,然后系统会根据设置的参数动态的变化对象的属性。

1、布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ImageView
android:id="@+id/iv"
android:layout_width="256dp"
android:layout_height="170dp"
android:scaleType="fitCenter"
android:src="@drawable/tweened"
android:layout_centerInParent="true" />

</RelativeLayout>

2、Animator

修改ImageView的宽度,先缩小到原有的一半,再恢复。使用ValueAnimator或ObjectAnimator。

(1) ValueAnimator

调用ValueAnimator.ofFloat设置动画的效果,从1.0到0.5,再到1.0。添加AnimatorUpdateListener监听动画效果来修改图片。
ValueAnimator animator = ValueAnimator.ofFloat(1.0f, 0.5f, 1.0f);
animator.setDuration(3000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float scale = (Float) animation.getAnimatedValue();
mImageView.setScaleX(scale);
}
});
animator.start();
(2) ObjectAnimator

ObjectAnimator可以简化上述过程,直接修改ImageView的scale值。
ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, "scaleX", 1.0f, 0.5f, 1.0f);
animator.setDuration(3000);
animator.start();



3、显示多个动画

(1) PropertyValuesHolder

定义多个PropertyValuesHolder,可以同时显示多个动画效果。如宽度、高度同时缩放。
PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.5f, 1.0f);
PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.5f, 1.0f);

ObjectAnimator.ofPropertyValuesHolder(mImageView, scaleXHolder, scaleYHolder)
.setDuration(2000).start();



(2) AnimatorSet

AnimatorSet也可以实现多个动画效果。
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mImageView, "scaleX", 1.0f, 0.5f, 1.0f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(mImageView, "scaleY", 1.0f, 0.5f, 1.0f);
AnimatorSet scaleAnimator = new AnimatorSet();
scaleAnimator.playTogether(scaleXAnimator, scaleYAnimator);
scaleAnimator.setDuration(2000);
scaleAnimator.start();
AnimatorSet还可以定义多个动画效果依次显示,例如依次显示背景变化,宽高度缩放,旋转的效果。

使用playSequentially方法依次进行显示。
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageView, "alpha", 1.0f, 0.5f, 1.0f);
alphaAnimator.setDuration(2000);

ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mImageView, "scaleX", 1.0f, 0.5f, 1.0f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(mImageView, "scaleY", 1.0f, 0.5f, 1.0f);
AnimatorSet scaleAnimator = new AnimatorSet();
scaleAnimator.play(scaleXAnimator).with(scaleYAnimator);
scaleAnimator.setDuration(2000);

ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mImageView, "rotation", 0f, 360f);
rotationAnimator.setDuration(2000);

AnimatorSet set = new AnimatorSet();
set.playSequentially(alphaAnimator, scaleAnimator, rotationAnimator);
set.start();
也可以使用play方法依次进行显示,效果和playSequentially是一样的。
ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageView, "alpha", 1.0f, 0.5f, 1.0f);
alphaAnimator.setDuration(2000);

ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mImageView, "scaleX", 1.0f, 0.5f, 1.0f);
scaleXAnimator.setDuration(2000);

ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(mImageView, "scaleY", 1.0f, 0.5f, 1.0f);
scaleYAnimator.setDuration(2000);

ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mImageView, "rotation", 0f, 360f);
rotationAnimator.setDuration(2000);

AnimatorSet set = new AnimatorSet();
set.play(scaleXAnimator).with(scaleYAnimator).before(rotationAnimator).after(alphaAnimator);
set.start();



4、自定义效果

(1) Keyframe

keyFrame是一个时间/值 对,通过它可以定义一个在特定时间的特定状态。

在下面的例子中,在不同的时间段设置了不同收缩值。
Keyframe keyframe1 = Keyframe.ofFloat(0, 1.0f);
Keyframe keyframe2 = Keyframe.ofFloat(0.2f, 0.5f);
Keyframe keyframe3 = Keyframe.ofFloat(0.4f, 1.0f);
Keyframe keyframe4 = Keyframe.ofFloat(0.6f, 0.2f);
Keyframe keyframe5 = Keyframe.ofFloat(0.8f, 0f);
Keyframe keyframe6 = Keyframe.ofFloat(1.0f, 1.0f);
PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofKeyframe("scaleX",
keyframe1, keyframe2, keyframe3, keyframe4, keyframe5, keyframe6);
PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofKeyframe("scaleY",
keyframe1, keyframe2, keyframe3, keyframe4, keyframe5, keyframe6);
ObjectAnimator.ofPropertyValuesHolder(mImageView, scaleXHolder, scaleYHolder)
.setDuration(5000).start();



(2) TypeEvaluator

TypeEvaluator根据属性的开始、结束值和因子计算出当前的属性值。已有子类ArgbEvaluator、IntEvaluator、FloatEvaluator和RectEvaluator等。

自定义TypeEvaluator显示特除效果。
private class CustomTypeEvaluator implements TypeEvaluator<Float> {
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
if (fraction <= 0.2) {
return startValue + fraction / 0.2f * (endValue - startValue);
} else if (fraction <= 0.4) {
return startValue + (0.4f - fraction) / 0.2f * (endValue - startValue);
} else if (fraction <= 1) {
return startValue + (fraction - 0.4f) / 0.6f * (endValue - startValue);
}
return endValue;
}
}

private void typeEvaluator() {
TypeEvaluator<Float> typeEvaluator = new CustomTypeEvaluator();
PropertyValuesHolder scaleXHolder = PropertyValuesHolder.ofObject("scaleX", typeEvaluator, 0f, 1.0f);
PropertyValuesHolder scaleYHolder = PropertyValuesHolder.ofObject("scaleY", typeEvaluator, 0f, 1.0f);
ObjectAnimator.ofPropertyValuesHolder(mImageView, scaleXHolder, scaleYHolder)
.setDuration(5000).start();
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: