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(); }
相关文章推荐
- android handler,looper子线程间通信
- (浅谈)Jpush推送通知点击跳转到具体界面
- Android四大基本组件介绍与生命周期
- Android 跟随手指移动的圆
- Android Studio无法关联Api23源码-提示Souces for android api 23 platform not found
- 【android学习】android端通过socket接收到数据产生乱码
- Android静态安全检测 -> Activity组件暴露
- 再谈Android应用瘦身
- Android百分比布局Percent支持库
- Android studio编译报错 报非法字符 \65279
- android studio遇到的问题
- Ubuntu下Android Studio模拟器启动失败
- Android开发:keytool' 不是内部或外部命令 也不是可运行的程序
- 加速Android Studio/Gradle构建
- byte数组合并
- Android自定义view详解
- android xmlns:tools用法
- android(二)、 应用启动过程
- android 搜索框 searchView
- Android MediaPlayer