Animation初探(二)

AlphaAnimation是透明度变换动画。它是Animation的子类,Animation太大了,后面再说,先来看看AlphaAnimation

一、AlphaAnimation有两个属性:

    private float mFromAlpha;
    private float mToAlpha;

一看就明白,从mFromAlpha变化到mToAlpha。其实AlphaAnimation的构造方法也就是设置这两个函数。

二、AlphaAnimation的构造方法:

1)

    /**
     * Constructor used when an AlphaAnimation is loaded from a resource. 
     * 
     * @param context Application context to use
     * @param attrs Attribute set from which to read values
     */
    public AlphaAnimation(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        TypedArray a =
            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.AlphaAnimation);
        
        mFromAlpha = a.getFloat(com.android.internal.R.styleable.AlphaAnimation_fromAlpha, 1.0f);
        mToAlpha = a.getFloat(com.android.internal.R.styleable.AlphaAnimation_toAlpha, 1.0f);
        
        a.recycle();
    }

  这个构造函数有两个输入参数,一个是上下文,一个是组件的设定参数。这个设定参数一来源于xml文件的配置,然后用TypedArray里面的方法把xml里面设定好的参数取出来,并给属性赋值。可以看见,如果我没有配置xml,mFromAlpha和mToAlpha就会取默认值1.0f,相当于新建了一个没有任何变化的动画。

2)  

    /**
     * Constructor to use when building an AlphaAnimation from code
     * 
     * @param fromAlpha Starting alpha value for the animation, where 1.0 means
     *        fully opaque and 0.0 means fully transparent.
     * @param toAlpha Ending alpha value for the animation.
     */
    public AlphaAnimation(float fromAlpha, float toAlpha) {
        mFromAlpha = fromAlpha;
        mToAlpha = toAlpha;
    }

  这是AlphaAnimation的另一个构造方法。这个更易懂,就是直接对mFromAlpha和mToAlpha赋值。

三、AlphaAnimation的其他方法。

1、applyTransformation

    /**
     * Changes the alpha property of the supplied {@link Transformation}
     */
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float alpha = mFromAlpha;
        t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
    }

  可见applyTransformation()方法就是动画具体的实现,系统会以一个比较高的频率来调用这个方法,我测试时调用频率大概为40+FPS。

  我们可以继承AlphaAnimation这个类并重写applyTransformation()这个方法,如果说,动画是一条横轴为时间,纵轴为透明度的函数,默认情况这个函数是一条直线,我们可以设置其中对映的计算公试。系统每秒会取几十个interpolatedTime的值,我们可以自己列出一个公式计算每个interpolatedTime对映的透明度。

  =======================================我是分割线========================================

  继续,下面再来看看ScaleAnimation。相较于applyTransformationScaleAnimation内容稍多一点。

一、这么多属性

private final Resources mResources;

    private float mFromX;
    private float mToX;
    private float mFromY;
    private float mToY;

    private int mFromXType = TypedValue.TYPE_NULL;
    private int mToXType = TypedValue.TYPE_NULL;
    private int mFromYType = TypedValue.TYPE_NULL;
    private int mToYType = TypedValue.TYPE_NULL;

    private int mFromXData = 0;
    private int mToXData = 0;
    private int mFromYData = 0;
    private int mToYData = 0;

    private int mPivotXType = ABSOLUTE;
    private int mPivotYType = ABSOLUTE;
    private float mPivotXValue = 0.0f;
    private float mPivotYValue = 0.0f;

    private float mPivotX;
    private float mPivotY;

  太多了,不一一说明,直接看方法里面怎么用吧。

二、先是构造方法

public ScaleAnimation(Context context, AttributeSet attrs)
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)

显而易见,总共4种。

第一种public ScaleAnimation(Context context, AttributeSet attrs):与public AlphaAnimation(Context context, AttributeSet attrs)类似,这个方法的属性全部来源于上下文和xml文件的设置。

第二种才是最简单的方法public ScaleAnimation(float fromX, float toX, float fromY, float toY):这个方法中图片宽度从fromX逐渐变为toX,图片的高度从fromY变为toY。变化的起始点为原图片的左上角。

第三种public ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)在第二种的基础上增加了两个输入参数。float pivotX, float pivotY这两个参数决定了,图片缩放的起始点。如果float pivotX, float pivotY都等于100,则意味着从图片的左上角的一个点,像右下方各平移100个像素点,图片在此处进行缩放。

第四种public ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)在第三种的基础上又添加了两个参数pivotXType和int pivotYType。通过改变这两个参数,float pivotX, float pivotY可以不仅仅是以象素点的形式控制缩放起始点,也可以以图片宽高百分比等多种形式。

以上。

 

原文地址:https://www.cnblogs.com/fishbone-lsy/p/4461778.html