android中tween动画自定义

来源:互联网 发布:工程进度网络图软件 编辑:程序博客网 时间:2024/05/22 13:18

由TranslateAnimation来看自定义动画:

  /**     * Constructor to use when building a TranslateAnimation from code     *     * @param fromXDelta Change in X coordinate to apply at the start of the     *        animation     * @param toXDelta Change in X coordinate to apply at the end of the     *        animation     * @param fromYDelta Change in Y coordinate to apply at the start of the     *        animation     * @param toYDelta Change in Y coordinate to apply at the end of the     *        animation     */    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;    }

构造函数中对移动信息做了初始化;

下面方法是根据interpolateTime,来计算出变换矩阵;

    @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);    }
   重写的方法:   @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);    }
initialize方法是在View的下面方法中调用:

 /**     * Utility function, called by draw(canvas, parent, drawingTime) to handle the less common     * case of an active Animation being run on the view.     */    private boolean applyLegacyAnimation(ViewGroup parent, long drawingTime,            Animation a, boolean scalingRequired) {        Transformation invalidationTransform;        final int flags = parent.mGroupFlags;        final boolean initialized = a.isInitialized();        if (!initialized) {            a.initialize(mRight - mLeft, mBottom - mTop, parent.getWidth(), parent.getHeight());            a.initializeInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop);            if (mAttachInfo != null) a.setListenerHandler(mAttachInfo.mHandler);            onAnimationStart();        }................................................}

interpolatedTime获得方式: 可以自定义插值器来 控制动画速度;

实现 Interpolator 接口;

0 0
原创粉丝点击