闲来无事,说说动画吧,之前也用过简单的动画,但每次都是上网查,不是很方便,想想还是写写吧。
说到Android 动画,能想到的就是Animations,它提供了一系列动画效果,旋转,平移,渐变等等。Animations大概可以分为两类:
一是Tween动画 即TweenedAnimations它提供了动画的 1、旋转RotateAnimation,2、平移TranslateAnimation,3、渐变AlphaAnimation ,4、缩放ScaleAnimation动画。
二是Frame动画即Frame-by-FrameAnimations 它可以顺序播放事先做好的图像,如一个drawable序列 与gif原理类似。
下面就分别介绍下几个动画吧,我写的是一个按钮的动画效果。
AlphaAnimations :渐变
1.代码实现
//AlphaAnimation类的第一个参数fromAlpha表示动画起始时的透明度,第二个参数toAlpha表示动画结束时的透明度
//setDuration设置动画时间,适用于这几类动画。
Animation alphaAnimation = new AlphaAnimation(0f, 1.0f);
alphaAnimation.setDuration(3000);
btnanimation.startAnimation(alphaAnimation);
其中0表示完全透明,1.0表示完全不透明。
2.xml实现
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="2000"
/>
</set>
在activity中引用
<span style="white-space:pre"> </span>Animation alphaAnimation = AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.alpha_animation);
alphaAnimation.setDuration(3000);
btnalpha.startAnimation(alphaAnimation);
RotateAnimation:旋转
1.代码实现
<span style="white-space:pre"> </span>//Animation rotateAnimation=new RotateAnimation(0f, 360f);
//Animation rotateAnimation=new RotateAnimation(0f, 360f,0.5f,0.5f);
Animation rotateAnimation=new RotateAnimation(0f, 360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnimation.setDuration(500);
btnrotate.startAnimation(rotateAnimation);
第一种两个参数:第一个参数为旋转动画的开始角度,第二个为旋转动画的结束角度。
第二种四个参数:第一个动画的开始角度,第二个动画的结束角度,第三第四应该是动画相对于物件的X、Y坐标的开始位(测试没有发现效果,有知道的同学可以告知下)
第三种六个参数:1、动画的开始角度。2、动画的结束角度。3、旋转x轴坐标的类型,有absolute绝对坐标,relative_to_self 相对于自身坐标,relative_to_parent相对于父控件坐标。4、x轴的值。5、旋转Y轴坐标的类型,同X轴。6、Y轴的值。后四个参数用于确定围绕旋转的圆的圆心位置。
2.在xml中使用。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="500"
/>
</set>
在activity中引用
<span style="white-space:pre"> </span>Animation rotateAnimation= AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.rotate_animation);
rotateAnimation.setDuration(500);
btnrotate.startAnimation(rotateAnimation);
fromDegrees 开始角度,toDegrees结束角度,正数为顺时针,负数为逆时针。privotX和pivotY为动画相对于物件的X、Y坐标的开始位。duration为持续时间。
ScaleAnimation:缩放
1.代码实现
<span style="white-space:pre"> </span>//Animation scaleAnimation = new ScaleAnimation(0f, 1.0f,0f,1.0f);
//Animation scaleAnimation = new ScaleAnimation(0f, 1.0f,0f,1.0f,1.0f,1.0f);
Animation scaleAnimation = new ScaleAnimation(0f, 1.0f,0f,1.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scaleAnimation.setDuration(500);
btnscale.startAnimation(scaleAnimation);
第一种四个参数 :第一和第二动画起始、结束时X坐标上的伸缩尺寸,第三和第四动画起始、结束时Y坐标上的伸缩尺寸.
第二种六个参数:和第一种的前四个相同,后面两个同样没测试出效果(知道的同学可以告知下)。
第三种八个参数:前四个参数和第一中相同,第五个为X轴坐标的类型,第六个X轴的值,第七个为Y轴坐标的类型,第八个为Y轴的值。
2.在xml中使用
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="500"
/>
</set>
在activity中引用
<span style="white-space:pre"> </span>Animation scaleAnimation = AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.scale_animation);<pre name="code" class="java"><span style="white-space:pre"> </span>scaleAnimation.setDuration(500);
<span style="white-space:pre"> </span>btnscale.startAnimation(scaleAnimation);
fromXScale,fromYScale动画起始时X,Y坐标上的伸缩尺寸。
toXScale,toYScale 动画结束时X,Y坐标上的伸缩尺寸。
pivotX,pivotY动画相对于物件X,Y坐标上的起始位置。fillAfter是否停留在执行完后的状态
TranslateAnimation :平移
1.代码实现
<span style="white-space:pre"> </span>//Animation translateAnimation = new TranslateAnimation(0f, 100.0f,0f,100.0f);
Animation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.5f);
translateAnimation.setDuration(1000);
btntranslate.startAnimation(translateAnimation);
第一种:第一个参数fromXDelta ,第二个参数toXDelta:分别是动画起始、结束时X坐标。
第三个参数fromYDelta ,第四个参数toYDelta:分别是动画起始、结束时Y坐标。
第二种:比第一种加了个类型,相对于谁来说。有absolute绝对坐标,relative_to_self 相对于自身坐标,relative_to_parent相对于父控件坐标2.在xml中使用
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="10"
android:toXDelta="100"
android:fromYDelta="10"
android:toYDelta="100"
/>
</set>
在activi中引用
Animation translateAnimation = AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.translate_animation);
fromXDelta ,fromYDelta 动画起始时X,Y坐标的位置。 toXDelta,toYDelta动画结束时X,Y坐标的位置。
还有一些通用的方法,这里也列举下:
setDuration(long durationmills)设置动画持续时间,单位毫秒
setFillAfter (boolean fillafter) 是否保留在动画执行完成的状态 true停留在执行的状态,false不停留。
setFillBefore (boolean fillBefore) 是否停留在动画执行之前的状态 true停留在执行之前的装填,false不停留。
setStartOffSet (long startOffSet) 动画执行之前的等待时间。
setRepeatCount (int repeatCount) 动画重复执行的次数。
上面都是单个动画执行,下面介绍下多个动画同时执行。
AnimationSet:动画集
Animation scaleAnimation = new ScaleAnimation(0f, 1.0f,0f,1.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
Animation alphaAnimation = AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.alpha_animation);
Animation rotateAnimation= AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.rotate_animation);
Animation translateAnimation = AnimationUtils.loadAnimation(ScaleAnimationActivity.this, R.anim.translate_animation);
AnimationSet set = new AnimationSet(true);
set.addAnimation(scaleAnimation);
set.addAnimation(alphaAnimation);
set.addAnimation(rotateAnimation);
set.addAnimation(translateAnimation);
btnanimationset.startAnimation(set);
将上面的例子集合下,满足多个动画效果。
Interpolator :
定义了动画变化的速率,定义了一下几种:
AccelerateDecelerateInterpolator | 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 |
AccelerateInterpolator | 在动画开始的地方速率改变比较慢,然后开始加速 |
CycleInterpolator | 动画循环播放特定的次数,速率改变沿着正弦曲线 |
DecelerateInterpolator | 在动画开始的地方速率改变比较慢,然后开始减速 |
LinearInterpolator | 在动画的以均匀的速率改变 |
在xml中的使用Android:interpolator="@android:anim/decelerate_interpolator"
在代码中的使用alphaAnimation.setInterpolator(new Accelerateinterpolator());
好了Tween就介绍到这里。下一篇讲Frame动画。