动画
View动画
View动画的作用对象是View,它支持4种动画效果,分别是平移动画,缩放动画,旋转动画和透明度动画。
平移动画 <translate> TranslateAnimation 移动View
缩放动画 <scale> ScaleAnimation 方法或缩小View
旋转动画 <rotate> RotateAnimation 旋转View
透明度动画 <alpha> AlphaAnimation 改变View的透明度
创建动画的XML文件,文件路径为:res/anim/filename
android:interpolator 插值器,默认为@android:anim/accelerate_decelerate_interpolator加速减速插值器android:shareInterpolator 集合中的动画是否和集合共享同一个插值器 <translate>android:fromXDeltaandroid:toXDeltaandroid:fromYDeltaandroid:toYDelta <scale>android:fromXScaleandroid:toXScaleandroid:fromYScaleandroid:toYScaleandroid:pivotXandroid:pivotY <rotate>android:fromDegreesandroid:toDegrees <alpha>android:fromAlphaandroid:toAlphaandroid:duration 动画持续的时间android:fillAfter 动画结束以后View是否停留在结束位置,true表示View停留在结束位置。 Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_test); mButton.startAnimation(animation);//通过代码来应用动画 AlphaAnimation alphaAnimation = new AlphaAnimation(0,1); alphaAnimation.setDuration(300); mButton.startAnimation(alphaAnimation);
通过Animation的setAnimationListener方法可以给View动画添加过程监听,接口如下
public static interface AnimationListener{ void onAnimationStart(Animation animation); void onAnimationEnd(Animation animation); void onAnimationRepeat(Animation animation); }
自定义View动画
需要继承Animation这个抽象类,然后重写它的initialize和applyTransformation方法。自定义动画的过程主要是矩阵变换的过程。
帧动画
帧动画是顺序播放一组预先定义好的图片,系统提供了一个类AnimationDrawable来使用帧动画;
在res/drawable/frame_animation.xml
<animation-list> <item android:drawable="" android:duration=""></animation-list>mButton.setBackgroundResource(R.drawable.frame_animation); AnimationDrawable drawable = (AnimationDrawable)mButton.getBackground(); drawable.start();
帧动画使用比较简单,但是比较容易引起OOM,尽量避免使用过多尺寸较大的图片。
View动画的特殊使用场景
LayoutAnimation
作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
<layoutAnimation> android:delay android:animationOrder : 子元素动画的顺序,normal,reverse和random android:animation 为子元素指定入场动画//为ViewGroup指定android:layoutAnimation="@anim/anim_layout"//通过代码实现Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item); LayoutAnimationController controller = new LayoutAnimationController(animaton); controller.setDelay(0.5f); controller.setOrder(LayoutAnimationController.ORDER_NORMAL); listView.setLayoutAnimation(controller);
Activity的切换效果
用到overridePendingTransition(int enterAnim, int exitAnim)方法,这个方法必须在startActivity或者finish方法之后被调用才能生效。
属性动画
属性动画可以对任意对象的属性进行动画不仅仅是View,可以达到的效果是:在一个时间间隔内完成对象从一个属性值到另一个属性值的改变。从API11才有,采用开源动画库nineoldandroids来兼容以前的版本。
可以通过XML来定义,定义在res/animator/目录下
<objectAnimator> 对应ObjectAnimator android:propertyName 属性名 android:duration android:valueFrom android:valueTo android:startOffset 动画的延迟时间 android:repeatCount 动画的重复次数 默认为0,-1为无限循环 android:repeatMode 动画的重复模式 有repeat和reverse表示连续重复和逆向重复 android:valueType 表示android:propertyName所指定的属性的类型,如intType,floatType分别表示属性的类型为整型和浮点型。 <animator> 对应ValueAnimator <set> 对应AnimatorSet android:ordering 有together和sequentially AnimationSet set = (AnimationSet) AnimationInflator.loadAnimator(myContext, R.anim.property_animator);set.setTarget(mButton);set.start();
插值器和估值器
LinearInterpolator 线性插值器
AccelerateDecelerateInterpolator 加速减速插值器
DecelerateInterpolator 减速插值器
TypeEvaluator 类型估值算法(估值器)
IntEvaluator整型 FloatEvaluator浮点型 ArgbEvaluator针对Color属性
属性动画要求对象的该属性有set方法和get方法(可选)
属性动画监听器
主要有两个接口:AnimatorUpdateListener和AnimatorListener
//它可以监听动画的开始,结束,取消以及重复播放public static interface AnimatorListener{ void onAnimationStart(Animator animator); void onAnimationEnd(Animator animator); void onAnimatonCancel(Animator animator); void onAnimationRepeat(Animator animator); } 系统还提供了AnimationListenerAdapter这个类,它是AnimatorListener的适配器类,可以有选择性实现上面的4个方法。//会监听整个动画过程,动画由许多帧组成,没播放一帧,onAnimationUpdate就会被调用一次。public static interface AnimationUpdateListener { void onAnimationUpdate(ValueAnimator animation); }
1.给你的对象加上get和set方法,如果有权限的话。
2.用一个类来包装原始对象,间接为其提供get和set方法
ViewWrapper wrapper = new ViewWrapper(mButton); ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();private static class ViewWrapper { private View mTarget; public ViewWrapper(View target){ mTarget = target; } public int getWidth(){ return mTarget.getLayoutParams().width(); } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } }
3.采用ValueAnimator,监听动画过程,自己实现属性的改变
属性动画的工作原理
属性动画要求动画作用的对象提供该属性的set方法,属性动画根据你传递的该属性的初始值和最终值,以动画的效果多次去调用set方法。ObjectAnimator继承了ValueAnimator
ObjectAnimator.ofInt(mButton,"width",500).setDuration(5000).start();
作者:James0525
链接:https://www.jianshu.com/p/e6358c09913e
共同学习,写下你的评论
评论加载中...
作者其他优质文章