一.动画定义
1.View动画
定义:通过场景了的对象不断做图像变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画。
2.帧动画
定义:(亦属View动画,表现形式不同)通过播放一系列图像从而产生动画效果。
3.属性动画
定义:通过动态改变对象的属性从而达到动画效果。
二.动画分类
1.View动画
1.1实现方式:
a: XML标签实现;
动画集合
android:interpolator: 插值器(影响动画的速度,比如非匀速动画需要通过插值器来控制动画的播放过程)
android:shareInterpolator: 表示集合中的动画是否和集合共享同一个插值器(如果集合不指定插值器,子动画标签需要单独指定所需的差值器或者默认值)
xml:
//<alpha>改变view透明度
//<translate>移动
//<rotate>旋转
//<scale>缩放
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="800"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:shareInterpolator="true"
>
<translate
android:fromYDelta="200"
android:toYDelta="120"
/>
<!--缩放起始值 fromXScale fromYScale-->
<!--缩放的轴点 x,y坐标pivotX pivotY(默认缩放为view的中心点)-->
<scale
android:fromXScale="1.2"
android:fromYScale="1.2"
android:toXScale="1"
android:toYScale="1"
/>
<!--旋转的开始角度,结束角度 fromDegrees toDegrees-->
<!--旋转的轴点 x,y pivotX pivotY(默认view左上角)-->
<rotate
android:fromDegrees="180"
android:toDegrees="0"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
/>
</set>
使用:
Button button = findViewById(R.id.button);
Animation animation = AnimationUtils.loadAnimation(R.anim.animation_layout);
button.startAnimation(animatioin);
b: Animation四个子类实现
(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation);
使用:
AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);
alphaAnimation.setDuration(100);
button.startAnimation(alphaAnimation);
可使用AnimationSet设置集合动画。
c: 自定义View动画,重写initialize(初始化工作)方法和applyTransformation(进行相应的矩阵变换)方法。
2.帧动画
2.1xml标签:
<animation-list>
<item android:drawable="图片资源id" andorid:durationo="200">
使用AnimationDrawable类:
buttom.setBackgroundResource(R.drawable.animation_frame);
AnimationDrawable drawable = (AnimationDrawable) button.getBackground();
drawable.start();
**帧动画使用图片大小尽量要小,容易oom
3.属性动画
分类:
a.传统的(translation,scale,rotate,alpha)
b.view的(可显示且提供可改方法)属性。
实现方式:
a.ObjectAnimator
//动画默认时间为300ms
ValueAnimator objectAnimator = ObjectAnimator.ofFloat(mIvTranslation, "translationX",
0, 700, 0);
objectAnimator.setDuration(5000);
objectAnimator.start();
b.xml标签
Animator animator1 = AnimatorInflater.loadAnimator(this,R.animator.value_single_xml);
animator1.setTarget(mIvXmlAnimationSet);
animator1.start();
value_single_xml.xml:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="-1"
android:repeatMode="reverse">
<propertyValuesHolder
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="500"
/>
</objectAnimator>
c.动画集合AnimatorSet
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
ObjectAnimator.ofFloat(mIvAnimationSet, "translationX",
0, 700, 0),
ObjectAnimator.ofFloat(mIvAnimationSet, "rotationX", 0, 360)
, ObjectAnimator.ofFloat(mIvAnimationSet, "rotationX", 0, 360)
, ObjectAnimator.ofFloat(mIvAnimationSet, "alpha", 0.5f, 1f, 0.5f, 1f)
);
animatorSet.setDuration(3000);
animatorSet.start();
xml动画集方式:
AnimatorSet animatorSet1 = (AnimatorSet) AnimatorInflater.
loadAnimator(this, R.animator.value_anim_xml);
animatorSet1.setTarget(mIvXmlAnimationSet);
animatorSet1.start();
value_anim_xml.xml:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:repeatCount="-1"
android:repeatMode="reverse">
<propertyValuesHolder
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="500"
/>
</objectAnimator>
d.view可改属性动画(用法跟ObjectAnimator使用一样)
AnimatorSet animatorSet2 = new AnimatorSet();
//平移动画循环播放
ObjectAnimator animator = ObjectAnimator.ofFloat(mTvOrtherValueSet, "translationX",
0, 700, 0);
animator.setRepeatCount(-1);
animator.setRepeatMode(ObjectAnimator.RESTART);
animatorSet2.playTogether(
animator,
/* ObjectAnimator.ofInt(mTvOrtherValueSet, "background", //background需要xml可定义 但是没有公开设置方法不行
R.color.gray,R.color.red,R.color.gray),*/
ObjectAnimator.ofInt(mTvOrtherValueSet, "BackgroundColor",
R.color.green,R.color.red,R.color.gray,R.color.green),
ObjectAnimator.ofFloat(mTvOrtherValueSet, "textSize", 20, 30,20)
, ObjectAnimator.ofFloat(mTvOrtherValueSet, "rotationY", 0, 360)
, ObjectAnimator.ofFloat(mTvOrtherValueSet, "alpha", 0.5f, 1f, 0.5f, 1f)
);
animatorSet2.setDuration(3000);
animatorSet2.start();
三.View动画的特殊使用场景
1.LayoutAnimation
作用:为ViewGroup指定一个动画,子元素出场都会具有这种动画效果。
关键类:LayoutAnimation
示例:
<!--animationOrder 子元素动画顺序 正序 倒序 随机-->
<!--delay 每个子元素延时加载的时间:
每个子元素的加载周期的百分比(子duration="800",delay="1"那么延时时间为400ms)-->
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_list_item"
android:animationOrder="normal"
android:delay="0.5"
/>
使用1:对应的ViewGroup标签里添加:
android:layoutAnimation="@anim/anim_list1"
使用2(LayoutAnimationController):
LayoutAnimationController layoutAnimationController = AnimationUtils.loadLayoutAnimation(this, R.anim.anim_list1);
layoutAnimationController.setDelay(0.8f);
layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
mRv1.setLayoutAnimation(layoutAnimationController);
2.Activity转场动画
作用:Activity切换时的动画效果。
关键方法:overridePendingTransition
示例:
startActivity(AnimationActivity.class);
overridePendingTransition(R.anim.anim_activity_enter,R.anim.anim_activity_out);
注意的问题: overridePendingTransition方法必须在startActivity(intent)或者finish()之后调用才能生效。
3.Fragment转场动画
作用:Fragment切换时的动画效果。
关键方法:setCustomAnimations
示例:
FragmentTransaction transaction = childFragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.anim_activity_enter,R.anim.anim_activity_out,R.anim.anim_activity_out,R.anim.anim_activity_out);
注意的问题: setCustomAnimations方法必须在rome(),add(),replace()方法调用之前调用,否则不起效果。
四.动画的插值器(Interpolator)和估值器(TypeEvaluator)
定义:
插值器:根据时间流逝的百分比来计算当前 属性值改变的百分比。
估值器:根据当前 属性改变的百分比 计算改变后的属性值。
作用: 属性动画可以用来实现非匀速动画的。
系统提供
插值器:
LinearInterpolator(线性插值器,即实现匀速动画)
DecelerateInterpolator(减速插值器,实现动画越来越慢效果)
AccelerateDecelerateInterpolator(加速减速插值器,实现动画前后慢中间过程快的效果)
估值器:
IntEvaluator(整形估值器,针对属性值为整形)
FloatEvaluator(浮点型估值器,针对属性值为浮点型)
ArgbEvaluator(颜色估值器,针对属性值为Color)
自定义:
自定义插值器:需要实现Interpolator或者TimeInterpolator。
自定义估值器:需要实现TypeEvaluator。
当需要对其他类型(非int,float,Color)做动画,那么必须自定义类型估值算法。
五.属性动画的监听器
1.AnimatorUpdateListener接口
监听动画整个过程,动画由许多帧组成的,每播放一帧,onAnimatorUpdate就会被调用一次
/**
* Implementors of this interface can add themselves as update listeners
* to an <code>ValueAnimator</code> instance to receive callbacks on every animation
* frame, after the current frame's values have been calculated for that
* <code>ValueAnimator</code>.
*/
public static interface AnimatorUpdateListener {
/**
* <p>Notifies the occurrence of another frame of the animation.</p>
*
* @param animation The animation which was repeated.
*/
void onAnimationUpdate(ValueAnimator animation);
}
2.AnimatorListener接口
public static interface AnimatorListener {
//当动画开始的时候调用.
void onAnimationStart(Animator animation);
//当动画结束的时候调用.
void onAnimationEnd(Animator animation);
//当动画取消的时候调用.(动画会结束 即调用结束方法)
void onAnimationCancel(Animator animation);
//动画重复播放时调用.
void onAnimationRepeat(Animator animation);
}