android 之动画的深入学习

android中的View Animation

1.Tween animation:

scale:

理论上而言,一个点是不存在什么缩放变换的,但考虑到所有图像都是由点组成,因此,如果图像在x轴和y轴方向分别放大k1k2倍的话,那么图像中的所有点的x坐标和y坐标均会分别放大k1k2倍,即


用矩阵表示就是:


源码:

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" />



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wqunwang506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值