Animations的分类
Animations从总体上可以分为两大类:
1.Tweened Animations:该类Animations提供了旋转、移动、伸展和淡出等效果。
Alpha——淡入淡出,Scale——缩放效果,Rotate——旋转,Translate——移动效果。
2.Frame-by-frame Animations:这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示(多张图片在指定时间内播放完)。
使用TweenedAnimations的步骤:
1.创建一个AnimationSet对象(Animation子类);(可以把几个动画对象放到这个set里面)
2.根据需要创建相应的Animation对象;
2.1 淡入淡出 AlphaAnimation(fromAlpha, toAlpha):参数是透明度,1表示完全不透明,0表示完全透明
2.2 旋转 RotateAnimation(fromDegree, toDegree, pivotxType, pivotxValue, pivotyType, pivotyValue)
fromDegree :0代表图片当前位置
pivotxType: x轴坐标的类型
Absoulte
relative_to_self:(pivotxValue 0.5f 表示控件自己宽度一半的位置),
relative_to_parent:父控件为参考值:0.5f表示父控件宽度一半的位置
2.3 缩放效果 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
fromX, toX: x轴从多大(fromX*self.width: 1.0*self.width)缩放到多大(toX*self.height 0.5*self.height) , y轴同理
pivotXType:absoulate, self, parent
pivotXValue:缩放的x轴的值:0.5f 表示self or parent一半的width, pivotYValue同理
2.4 移动效果 TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
fromx, tox: x轴从(parent or self or absloute) fromx*(self or parent) 移动 tox*(self or parent), y轴同理
<!-- 左进右出 :slide_in_left,slide_out_right:-100->0, 0->100 --> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0%p" android:toXDelta="100%p"android:duration="@android:integer/config_mediumAnimTime"/> </set> <!-- 右进左出 :slide_in_right,slide_out_left:100->0, 0->-100 --> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> </set> <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-100%p"android:duration="@android:integer/config_mediumAnimTime"/> </set>
AlphaAnimation alphaAnimation = new AlphaAnimation(tmpAlpha[0], tmpAlpha[1]); alphaAnimation.setFillAfter(true); alphaAnimation.setDuration(duration); alphaAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { bgGrayView.setVisibility(View.VISIBLE); } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub } }); listView.startAnimation(alphaAnimation);
3.根据动画的需求,为Animation对象设置相应的数据;
4.将Animatin对象添加到AnimationSet对象当中;
5.使用控件对象开始执行AnimationSet。
6.如果要设置动画的xml文件,对于interpolator这个属性,必须要设置在<set>里面才可以生效<set android:interpolator="@android:anim/bounce_interpolator"></set>
@android:anim/accelerate_interpolator: 越来越快 @android:anim/decelerate_interpolator:越来越慢 @android:anim/accelerate_decelerate_interpolator:先快后慢 @android:anim/anticipate_interpolator: 先后退一小步然后向前加速 @android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点 @android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点 @android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点 @android:anim/linear_interpolator:均匀速度
7.Animation和Visible的问题
在做一个功能,底部有个Bar,一点击就从底部升上来,再点击就消失,并在onAnimationEnd里visible设为gone,但是发现,这个gone没有效果,这个bar竟然还在响应点击事件。 上网一查,发现要清除动画,即在onAnimationEnd里调用view.clearAnimation();即可,目前来看不用设置gone
8.AnimatorSet有序或者同时运行多个动画代码如下
AnimatorSet animSet = new AnimatorSet(); //view是要被动画的对象 ObjectAnimator startAlpha = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 1.0f); ObjectAnimator endAlpha = ObjectAnimator.ofFloat(view, "alpha", 1f, 0.0f); startAlpha.setDuration(500); endAlpha.setDuration(1000); //在endAlpha前先播放startAlpha的动画 animSet.play(startAlpha).before(endAlpha); //同时播放 animSet.play(anim1).with(anim2); animSet.start(); /** 先播放anim1,再同时播放anim2,anim3,anim4,最后播anim5 animSet.play(anim1).before(anim2); .play(anim2).with(anim3); .play(anim2).with(anim4); .play(anim5).after(amin2); **/
9.view本来隐藏状态,想通过动画显示,第一次动画无效:该情况是,view的visiblity是gone,应该设为invisible,这样第一次动画才会生效