补间动画详解四 平移动画TranslateAnimation

原创 2016年08月29日 19:07:42
TranslateAnimation是平移动画的类,负责View的位移。

TranslateAnimation类官方文档:
https://developer.android.com/reference/android/view/animation/TranslateAnimation.html

关于父类Animation的详解可参考文章:
http://blog.csdn.net/ruancoder/article/details/52347243

一、TranslateAnimation的使用
(1).使用xml文件创建TranslateAnimation
属性说明:
android:fromXDelta:动画开始点的X轴坐标。有三种表示方式,一是纯数字,使用绝对位置(比如"50",表示以当前View左上角坐标加50px作为X坐标);二是百分数,相对于控件本身定位(比如"50%",表示以当前View的左上角加上当前View宽度的50%作为X坐标);三是百分数p,相对于父控件定位(比如"50%p",表示以当前View的左上角加上父控件宽度的50%做为X坐标)。
android:fromYDelta:动画开始点的Y轴坐标。
android:toXDelta:动画结束点的X轴坐标。
android:toYDelta:动画结束点的Y轴坐标。

示例代码:

从屏幕底部进入的动画。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="3000">
    <translate
        android:fromYDelta="100%p"
        android:toYDelta="0.0"/>
</set>


从屏幕左侧退出的动画。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="3000">
    <translate
        android:fromXDelta="0.0"
        android:toXDelta="-100%p"/>
</set>

(2).使用java代码创建TranslateAnimation
示例代码:
//从当前位置,向下和向右各平移300px
TranslateAnimation animation = new TranslateAnimation(0.0f, 300.0f, 0.0f, 300.0f);
animation.setDuration(3000);
view.startAnimation(animation);

// 从屏幕底部进入的动画
TranslateAnimation animation = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_PARENT, 0.0f
);
animation.setDuration(3000);
view.startAnimation(animation);

二、TranslateAnimation的分析
TranslateAnimation继承自Animation,除了拥有父类的属性外,添加了mFromXType、mToXType、mFromYType、mToYType和mFromXValue、mToXValue、mFromYValue、mToYValue八个属性。这个八个属性可以通过构造方法或xml属性传入,最终由mFromXDelta、mToXDelta、mFromYDelta和mToYDelta参与动画的计算。
public class TranslateAnimation extends Animation {
    private int mFromXType = ABSOLUTE;
    private int mToXType = ABSOLUTE;
    private int mFromYType = ABSOLUTE;
    private int mToYType = ABSOLUTE;


    protected float mFromXValue = 0.0f;
    protected float mToXValue = 0.0f;
    protected float mFromYValue = 0.0f;
    protected float mToYValue = 0.0f;


    protected float mFromXDelta;
    protected float mToXDelta;
    protected float mFromYDelta;
    protected float mToYDelta;
}

使用java代码的方式创建TranslateAnimation,传入六个参数,fromXType、fromXValue、toXType、toXValue和fromYType、fromYValue、toYType、toYValue,使用如下构造方法。
参数说明:
fromXType:动画开始前的X坐标类型。取值范围为ABSOLUTE(绝对位置)、RELATIVE_TO_SELF(以自身宽或高为参考)、RELATIVE_TO_PARENT(以父控件宽或高为参考)。
fromXValue:动画开始前的X坐标值。当对应的Type为ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。
toXType:动画结束后的X坐标类型。
toXValue:动画结束后的X坐标值。
fromYType:动画开始前的Y坐标类型。
fromYValue:动画开始前的Y坐标值。
toYType:动画结束后的Y坐标类型。
toYValue:动画结束后的Y坐标值。
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
                          int fromYType, float fromYValue, int toYType, float toYValue) {


    mFromXValue = fromXValue;
    mToXValue = toXValue;
    mFromYValue = fromYValue;
    mToYValue = toYValue;


    mFromXType = fromXType;
    mToXType = toXType;
    mFromYType = fromYType;
    mToYType = toYType;
}

使用java代码的方式创建TranslateAnimation,传入四个参数,fromXDelta、toXDelta、fromYDelta和toYDelta,使用如下构造方法。
此时mFromXType、mToXType、mFromYType和mToYType默认为ABSOLUTE。
参数说明:
fromXDelta:动画开始前,离当前View X坐标上的距离。
toXDelta:动画结束后,离当前View X坐标上的距离。
fromYDelta:动画开始前,离当前View Y坐标上的距离。
toYDelta:动画结束后,离当前View Y坐标上的距离。
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
    mFromXValue = fromXDelta;
    mToXValue = toXDelta;
    mFromYValue = fromYDelta;
    mToYValue = toYDelta;


    mFromXType = ABSOLUTE;
    mToXType = ABSOLUTE;
    mFromYType = ABSOLUTE;
    mToYType = ABSOLUTE;
}

当使用xml文件的方式创建TranslateAnimation时,由AnimationUtils工具类加载动画文件,使用如下构造方法,通过xml中的属性来获取值。
public TranslateAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.TranslateAnimation);

    Animation.Description d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.TranslateAnimation_fromXDelta));
    mFromXType = d.type;
    mFromXValue = d.value;

    d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.TranslateAnimation_toXDelta));
    mToXType = d.type;
    mToXValue = d.value;

    d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.TranslateAnimation_fromYDelta));
    mFromYType = d.type;
    mFromYValue = d.value;

    d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.TranslateAnimation_toYDelta));
    mToYType = d.type;
    mToYValue = d.value;

    a.recycle();
}

完成成员变量的初始化后,接下来进入动画的计算。核心在于重写父类Animation的initialize()和applyTransformation()方法。

initialize()方法中,根据上面传入的八个属性值,结合当前View和父View的宽高,计算出平移的绝对位置。
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
    super.initialize(width, height, parentWidth, parentHeight);
    mFromXDelta = resolveSize(mFromXType, mFromXValue, width, parentWidth);
    mToXDelta = resolveSize(mToXType, mToXValue, width, parentWidth);
    mFromYDelta = resolveSize(mFromYType, mFromYValue, height, parentHeight);
    mToYDelta = resolveSize(mToYType, mToYValue, height, parentHeight);
}

protected float resolveSize(int type, float value, int size, int parentSize) {
    switch (type) {
        case ABSOLUTE:
            return value;
        case RELATIVE_TO_SELF:
            return size * value;
        case RELATIVE_TO_PARENT:
            return parentSize * value;
        default:
            return value;
    }
}

applyTransformation()方法负责动画的执行。在动画从开始倒结束的过程中,参数interpolatedTime从0.0递增到1.0。通过不断的调整dx和dy的值,调用Matrix的setTranslate()方法,达到平移View的效果。
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    float dx = mFromXDelta;
    float dy = mFromYDelta;
    if (mFromXDelta != mToXDelta) {
        dx = mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime);
    }
    if (mFromYDelta != mToYDelta) {
        dy = mFromYDelta + ((mToYDelta - mFromYDelta) * interpolatedTime);
    }
    t.getMatrix().setTranslate(dx, dy);
}

版权声明:本文为博主原创文章,转载请注明出处。

【Android动画九章】-TranslateAnimation(位移动画)

上一节介绍了AlphaAnimation动画的用法,本节将介绍另一种形式的动画-TranslateAnimation(位移动画)。 public class TranslateAnimation ...
  • yayun0516
  • yayun0516
  • 2016年04月28日 21:34
  • 6930

TranslateAnimation详解

TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta); 从(fromXDe...
  • anlidengshiwei
  • anlidengshiwei
  • 2015年11月09日 10:19
  • 4605

自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随...
  • harvic880925
  • harvic880925
  • 2014年10月11日 16:53
  • 85807

TranslateAnimation 动画参数详解及其bug

一.TranslateAnimation参数 TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float...
  • kluing
  • kluing
  • 2015年02月03日 21:09
  • 5998

Android Animation各种动画完全解析

1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参...
  • weixin_35791555
  • weixin_35791555
  • 2017年03月17日 10:37
  • 611

简单位移动画TranslateAnimation

已不再推荐补间动画,请使用属性动画; http://blog.csdn.net/guolin_blog/article/details/43536355 http://blog.csdn.net/gu...
  • gundumw100
  • gundumw100
  • 2017年04月10日 18:33
  • 141

TranslateAnimation从上往下平移动画

TranslateAnimation从上往下平移动画
  • bob_Xing_Yang
  • bob_Xing_Yang
  • 2016年04月08日 15:22
  • 5089

视图动画:RotateAnimation、TranslateAnimation、ScaleAnimation、AlphaAnimation

视图动画只适合于简单的界面效果,如果需要与用户进行交互时尽量不要使用,因为视图动画只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。而且对于视图动画,并不改变属性的值...
  • u011572517
  • u011572517
  • 2016年09月03日 14:05
  • 463

android TranslateAnimation类作动态菜单

要实现的效果如图: 代码很简单,主要是TranslateAnimation类的 public TranslateAnimation (int fromXType, float fr...
  • wufenglong
  • wufenglong
  • 2011年12月27日 23:29
  • 15912

利用TranslateAnimation实现

  • 2013年08月29日 18:34
  • 1.18MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:补间动画详解四 平移动画TranslateAnimation
举报原因:
原因补充:

(最多只允许输入30个字)