android动画有补间动画也有属性动画,还有布局动画等。今天就先从简单的四种基本补间动画说起。
补间动画有:平移,缩放,旋转,透明。使用方式有两种:xml和java代码。
android:fillAfter 表示动画结束后是否停留在最后一帧,即停在结束位置;
android:duration表示动画的持续时间;
android:interpolator表示动画的运行规律(插值器),比如先快后慢或者先慢后快等;
android:repeatCount 表示重复次数,默认值是0,代表重复1次;如果值是repeatCount=n代表重复 n+1次;值为-1或者infinite时,表示补间动画永不停止;
android:repeatMode 设置重复的模式,默认是restart,当repeatCount的值大于0或者为-1或infinite时才有效:
1.如果是:restart,表示每次执行完都会从头开始;
2.如果是:reverse,表示第一次从头开始,第二次反过来,第三次从头开始,第四次反过来,即偶数次是反着的;
3.举例说明,从位置A平移到B:
a.如果是restart,那么每次都是A-B,瞬间回到A然后又A-B,不断重复;
b.如果是reverse,那么第一次是A-B,第二次是B-A,第三次是A-B,第四次是B-A,这样循环下去,结果是就是来回移动了;
一.平移动画TranslateAnimation
1.XML实现方式(res/anim,没有此文件夹自己建立):
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXDelta="0"
android:fromYDelta="0"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toXDelta="50%p"/>
使用:
Animation tran = AnimationUtils.loadAnimation(this,R.anim.translate);
translate.startAnimation(tran);
属性说明:
android:fromXDelta,平移的起点x方向坐标(android:toXDelta和Y方向的同理):
1.如果值是数值类型,即20或者25.0之类的,譬如50表示以当前View左上角坐标加50px为初始点;
2.如果值是百分比类型,即20%或者50%之类的,50%表示以当前View的左上角加上当前View宽高的50%做为初始点;
3.如果是父值的类型,即-100%p或者100%p之类的,50%p表示以当前View的左上角加上父控件宽高的50%做为初始点;
2.代码实现方式:
Animation tran1 = new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,1,Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,0);
tran1.setDuration(2000);
translate.startAnimation(tran1);
8个参数依次:起点x的坐标参照,起点x的坐标值,终点x的坐标参照,终点x的坐标值,起点y的坐标参照,起点y的坐标值,终点y的坐标参照,终点y的坐标值;
坐标参照是用来设置位置的,比如:
RELATIVE_TO_PARENT(XML中父值的类型):相当于用XML时的“android:toXDelta=”50%p”中的p,表示以父控件为参照,1代表100%p,0.5代表50%p,Y方向同理;
RELATIVE_TO_SELF(XML中百分比类型):相当于XML时的“android:toXDelta=”50%”,以自身为参照,1相当于XML中的100%,0.5相当于XML中的50%,Y方向同理;
ABSOLUTE(XML中数值类型):相当于XML中的“android:toXDelta=”50”;
即三种参数其实跟XML中的使用方式是对应的,如果不懂看XML方式来理解就懂了。
如果在代码中不写坐标参照即只有4个参数值,默认是ABSOLUTE方式。
二:缩放动画
1.XML实现方式:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toXScale="50%p"
android:toYScale="50%p" />
使用:
Animation scaleAn = AnimationUtils.loadAnimation(this,R.anim.scale);
scale.startAnimation(scaleAn);
android:fromXScale,缩放开始时的x方向大小;
android:toXScale,缩放开始时的y方向大小;
android:pivotX,缩放的中心的x坐标(即以某个点为中心进行缩放);
以上3个属性y方向的同理。
android:fromXScale和android:toXScale,还有Y方向的属性值也有三种形式(以android:fromXScale举例):
1.如果值是数值类型,即1或者2之类的表示缩放动画开始时的宽是自身宽的1或者2倍;
2.如果值是百分比类型,即20%或者50%之类的,表示缩放动画开始时的宽是自身宽的20%或者50%;
3.如果是父值类型,即50%p或者100%p之类的,表示缩放动画开始时的宽是父控件宽的50%或者100%;
android:pivotX的属性值有两种形式:
1.如果值是百分比类型,即20%或者50%之类的,表示缩放的中心点x坐标在自身左上角坐标+自身宽度的20%或者50%处;
2.如果是父值类型,即50%p或者100%p之类的,表示缩放的中心点x坐标在自身左上角坐标+父控件宽度的50%或者100%处;
补充:如果是数值类型,比如1或者2,无效,无论是多少,都表示缩放的中心点是自身的左上角。
2.代码实现方式:
Animation scale1 = new ScaleAnimation(1f,0.5f,1f,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
scale1.setDuration(2000);
scale.startAnimation(scale1);
8个参数依次:起始宽度,结束宽度,缩放起始高度,结束高度,缩放中心点x方向的坐标参照,缩放中心点的x坐标,缩放中心点y方向的坐标参照,缩放中心点的y坐标;
前4个参数只能是float格式,效果都是自身宽高的倍数,比如例子中表示,起始宽度是自身宽度1倍,结束宽度是自身一半;
后面4个参数中三种写法:
Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f,表示中心点是自身左上角坐标+父控件宽高的一半;
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f,表示中心点是自身左上角坐标+自身宽高的一半;
Animation.ABSOLUTE,100,Animation.ABSOLUTE,100,表示中心点是自身左上角坐标+100;
三.透明动画
1.XML实现方式:
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromAlpha="1"
android:repeatCount="-1"
android:repeatMode="reverse"
android:toAlpha="0.5">
alpha>
android:fromAlpha和android:toAlpha分别表示开始和结束时的透明度,值只有一种格式,0-1之间的数,1表示不透明,0表示完全透明,这个比较简单。
2.代码中设置:
Animation alpha1 = new AlphaAnimation(1,0);
alpha1.setDuration(2000);
alpha.startAnimation(alpha1);
透明动画比较简单,两个参数,一个是开始的透明度,一个是结束的透明度,值与在XML中写的格式相同。
四,旋转动画
1.XML实现方式:
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:toDegrees="-90">rotate>
android:fromDegrees和android:toDegrees分别表示起始和结束的角度,值只能是一种格式,数值类型,可以说int也可以是float,代表角度。
2.代码实现方式:
Animation rotateAn = new RotateAnimation(90,-90,Animation.ABSOLUTE,100,Animation.ABSOLUTE,100);
rotate.startAnimation(rotateAn);
前两个参数表示开始角度和结束角度,没啥好说的。
后面4个参数中三种写法:
Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f,表示旋转中心点是自身左上角坐标+父控件宽高的一半;
Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f,表示旋转中心点是自身左上角坐标+自身宽高的一半;
Animation.ABSOLUTE,100,Animation.ABSOLUTE,100,表示旋转中心点是自身左上角坐标+100;
最后,汇总:上面四种动画都是单独使用的,我们如果想混合使用,比如变大的同时变透明,那就得组合动画了,组合动画也是一样的可以XML也可以代码写:
1.XML实现方式:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:interpolator="@android:anim/cycle_interpolator"
android:shareInterpolator="true">
<translate
android:duration="1000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="50%p"
android:toYDelta="0" />
<alpha
android:duration="1000"
android:fromAlpha="1"
android:repeatCount="1"
android:repeatMode="reverse"
android:toAlpha="0.5" />
<scale
android:fromXScale="1"
android:fromYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="1"
android:repeatMode="reverse"
android:toXScale="0.5"
android:toYScale="0.5" />
set>
android:shareInterpolator表示set标签下的多个动画共用一个插值器,如果不需要,那就单独设置插值器。
2.代码中设置:
AnimationSet animationSet = new AnimationSet(true);//共享插值器
animationSet.addAnimation(scale);
animationSet.addAnimation(alpha);
animationSet.addAnimation(rotate);
animationSet.addAnimation(translate);
view.startAnimation(animationSet);
很简单,用set将各个单独的动画加进去,然后start就行了。
四种基本补间动画基本说完了,还是很简单的,不过它并不完美,比如如果一个按钮设置了点击事件,然后你平移了它,此时你点击新的位置的它,是不会有反应的,因为它还在原来的位置,只是我们肉眼看着它移走了,实际上它还是没动的,所以此时就需要属性动画了,属性动画在后面会再补上。