android中的View Animation
1.Tween animation:
scale:
理论上而言,一个点是不存在什么缩放变换的,但考虑到所有图像都是由点组成,因此,如果图像在x轴和y轴方向分别放大k1和k2倍的话,那么图像中的所有点的x坐标和y坐标均会分别放大k1和k2倍,即
用矩阵表示就是:
源码:
public ScaleAnimation(float fromX, float toX, float fromY, float toY);
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
float pivotX, float pivotY)
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
Log.i("Test", "applyTransformation interpolatedTime=" + interpolatedTime);
float sx = 1.0f;
float sy = 1.0f;
if (mFromX != 1.0f || mToX != 1.0f) {
sx = mFromX + ((mToX - mFromX) * interpolatedTime);
}
if (mFromY != 1.0f || mToY != 1.0f) {
sy = mFromY + ((mToY - mFromY) * interpolatedTime);
}
Matrix matrix = t.getMatrix();
if (mPivotX == 0 && mPivotY == 0) {
t.getMatrix().setScale(sx, sy);
} else {
t.getMatrix().setScale(sx, sy, mPivotX, mPivotY);
}
}
此方法会被不停地调用产生缩放动画
fromXScale(浮点型) 属性为动画开始时X轴上的的缩放值,即K1
fromYScale(浮点型) 属性为动画开始时Y轴上的的缩放值,即K2
toXScale(浮点型) 属性为动画结束时X轴上的的缩放值,即K1
toYScale(浮点型) 属性为动画结束时Y轴上的的缩放值,即K2
例子:Animation a=new ScaleAnimation(0f, 2f, 0f,2f); a.setDuration(time);
当我们通过View.startAnimation()开始播放动画时,系统会根据给定的播放动画的时间,算出每次调用applyTransformation方法时,所传入的interpolatedTime值,首次调用时为interpolatedTime=0,这时候sx=0;sy=0;这里我们默认围绕坐标原点进行缩放所以会调用t.getMatrix().setScale(sx, sy);这时候sx,sy就是上面矩阵中的k1,k2.即缩放系数。所以刚开始图片会缩放到没有,就是我们创建动画对象时所传入的fromXScale,fromYScale这两个值所决定的(倘若我们传过去0.5,0.5那么,动画开始时view会缩放到原来的0.5倍。)之后每次调用该方法时,interpolatedTime的值会逐渐增大,但总是<1,拿本例来说,sx,sy,起初值为0,然后会逐渐增大,同时也会不停地调用t.getMatrix().setScale(sx, sy),产生动画效果,最后interpolatedTime的值会变为1,sx,sy,变为2,会又回到最初的view的状态。有实例我们也可以总结出,当fromXScale>toXScale时,动画效果是缩小,反之是增大。
pivotX(浮点型) pivotY(浮点型)表示控件围绕哪个点进行缩放,默认是围绕坐标原点。(0,0)
这两个值又有三种类型
ABSOLUTE:绝对值:new ScaleAnimation(0f, 2f, 0f,2f,5f,8f);表示view围绕点(5,8)进行缩放。
RELATIVE_TO_SELF:new ScaleAnimation(0f, 2f, 0f,2f,5f,8f):表示view围绕点(view.getWidth()*5,view.getHeigth()*8)进行缩放
RELATIVE_TO_PARENT:new ScaleAnimation(0f, 2f, 0f,2f,5f,8f):表示view围绕点(view.getParentWidth()*5,view.getParentHeigth()*8)进行缩放
其他几种动画道理都是一样的,不在一一详述
android:layoutAnimation:Defines the layout animation to use the first time the ViewGroup is laid out.当着个Viewgroup首次展示的时候所使用的动画,也就是说只能用在VIewgroup中,只有ViewGroup在具备这个属性
<ListView
android:id="@android:id/list"
android:persistentDrawingCache="animation|scrolling"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_bottom_to_top_slide" />
R.anim.layout_bottom_to_top_slide
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%" //动画持续的时间
android:animationOrder="reverse" //动画的顺序,正常,反转,随即
android:animation="@anim/slide_right" />