是时候对安卓动画这块做一个详细的总结了,学会了动画就可以做一些很炫的效果出来,这样的应用很得用户的喜欢。安卓中的动画目前总共可以分为3类:补间动画、帧动画、属性动画。其中第三种是3.0后才出现的,与其他两种不同的是,这种动画改变的属性是View本身的属性。动画可以用代码来写,也可以用XML文件的形式来写,下面就按照3大类2中方式的形式分别做一个演示。
提供一个获取view中心点的方法:
// 获取view的中心点
private static int[] getPivot(View view) {
int[] viewleft = new int[2];
view.getLocationInWindow(viewleft);
int width = view.getWidth();
int height = view.getHeight();
int[] viewpivot = new int[2];
viewpivot[0] = viewleft[0] + width / 2;
viewpivot[1] = viewleft[1] + height / 2;
Log.e("", "view在屏幕中的XY坐标:" + viewleft[0] + "," + viewleft[1] + "中心点的位置:" + viewpivot[0] + "," + viewpivot[1]);
return viewpivot;
}
下面进入今天的主题~~~~~~~~~~
一、补间动画
补间动画的效果有:旋转、缩放、改变透明度、平移
1.1旋转 代码演示:
// 旋转
<span style="white-space:pre"> </span>public static RotateAnimation rotate(View view) {
<span style="white-space:pre"> </span>// 建一个对象,围绕自身中心旋转
<span style="white-space:pre"> </span>RotateAnimation ra = new RotateAnimation(0, 359, RotateAnimation.RELATIVE_TO_SELF, (float) 0.5,
<span style="white-space:pre"> </span>RotateAnimation.RELATIVE_TO_SELF, (float) 0.5);
<span style="white-space:pre"> </span>ra.reset();
<span style="white-space:pre"> </span>ra.setDuration(1000 * 5);
<span style="white-space:pre"> </span>// 重复模式
<span style="white-space:pre"> </span>ra.setRepeatMode(RotateAnimation.RESTART);
<span style="white-space:pre"> </span>ra.setInterpolator(new AnticipateInterpolator());
<span style="white-space:pre"> </span>ra.setRepeatCount(3);
<span style="white-space:pre"> </span>return ra;
<span style="white-space:pre"> </span>}
Interpolator有以下值:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
如果android定义的interpolators不符合你的效果也可以自定义interpolators
1.2旋转 XML演示:
创建文件:res/anim/rotate.xml,文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromDegrees="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50"
android:pivotY="50"
android:toDegrees="360" >
</rotate>
java代码如下:
am = AnimationUtils.loadAnimation(this, R.anim.rotate);
ib.setAnimation(am);
2.1Alpha 代码演示:
// 渐变
public static AlphaAnimation setAlpha() {
AlphaAnimation aa = new AlphaAnimation(1, 0);
aa.setDuration(5 * 1000);
aa.setZAdjustment(10);
return aa;
}
2.2Alpha XML演示:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromAlpha="1"
android:interpolator="@android:anim/bounce_interpolator"
android:toAlpha="0" >
</alpha>
注意:以view的左上角为原点
// translation
public static TranslateAnimation setTransfor() {
TranslateAnimation ta = new TranslateAnimation(-100, 100, -100, 100);
ta.setDuration(5 * 1000);
ta.setRepeatCount(2);
return ta;
}
3.2translation XML演示:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromXDelta="-100"
android:fromYDelta="-100"
android:toXDelta="200"
android:toYDelta="200" >
</translate>
4.1缩放 代码演示:
<span style="font-size:10px;"> // 缩放
public static ScaleAnimation setScale() {
ScaleAnimation sa = new ScaleAnimation(0, 5, 0, 5, ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(5000);
sa.setRepeatCount(5);
return sa;
}</span>
4.2缩放 XML演示:
<span style="font-size:10px;"><?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:fromXScale="0"
android:fromYScale="0"
android:toXScale="5"
android:toYScale="5" >
</scale></span>
结合显示:
// 集合
public static AnimationSet setList() {
AnimationSet as = new AnimationSet(false);
as.setDuration(5000);
as.addAnimation(setAlpha());
as.addAnimation(setRotate());
as.addAnimation(setScale());
as.addAnimation(setTransfor());
return as;
}
二、帧动画
在res/animator或者res/drawable下面建一个XML文件,内容是类似下面的形式:
<span style="font-size:12px;"><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/sheep"
android:duration="1000"/>
<item
android:drawable="@drawable/ic_launcher"
android:duration="1000"/>
<item
android:drawable="@drawable/sheep"
android:duration="1000"/>
</animation-list></span>
然后在调用处:
ib.setBackgroundResource(R.animator.list);
ad = (AnimationDrawable) ib.getBackground();
ad.start();
就可以了。
三、属性动画
先来看看和这个动画相关的类:
ObjectAnimator 动画的执行类,后面详细介绍
ValueAnimator 动画的执行类,后面详细介绍
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。
AnimatorInflater 用户加载属性动画的xml文件
TypeEvaluator 类型估值,主要用于设置动画操作属性的值。
TimeInterpolator 时间插值,就是在动画开始或者结束的时候增加一些额外的效果
该动画可以用XML文件写,也可以用代码写
属性动画和补间动画最大的区别就是属性动画改变的是View本身的属性,比如是让一个View移动,那么它是不断的改变View的坐标,然后重新绘制View,我们看到的动画其实都是view 绘制后的截图。其原理就是通过动画执行类,更加对其设置的数据对View进行操作,具体的动画执行类有ObjectAnimator、ValueAnimator,还有一个动画集合类AnimatorSet,其实ObjectAnimator就是继承于ValueAnimator,他们的使用方法其实就是ValueAnimator多了一步就是必须要添加一个监听接口:ValueAnimator.addUpdateListener(),下面对其使用做一个简要的说明,补间动画能设置的效果属性动画就能设置,他们其实功能是一样的。
改变X值:
<span style="font-size:14px;"> // 设置动画的属性
ValueAnimator va = ValueAnimator.ofFloat(360).setDuration(1000);
va.setRepeatCount(5);
// 动画改变监听
va.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 取到根据上面设置的属性算出对应的值,然后更新的接口里面得到对应的值用来对
// View不同的属性设置该值,得到想要的效果
iv.setRotationX((Float) animation.getAnimatedValue());
}
});
// 监听动画的开始介绍等,我只重写了一个方法,如要监听别的,请自己重写对应的方法
va.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Log.e("", "动画结束啦!");
}
});
// 该方法必须调用,否则没有效果
va.start();</span>
用XML文件实现同样的效果:
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="rotationX"
android:repeatCount="5"
android:valueTo="360" >
</objectAnimator></span>
扫描关注我的微信公众号:
ok,动画的知识大概就是这么多,具体的细节就没写那么明白了。有了整体的认识,就知道怎么去学习了,学完了之后也懂得自己都学了点啥,这就是我写这边文章的目的,限于目前的水平,可能写的不是很好,我会努力的~~~~~
附上我练习的源码:Demo下载