视图动画实现类的分工

来源:互联网 发布:淘宝找不到自己的店铺 编辑:程序博客网 时间:2024/06/06 18:39

视图动画的实现是不停的刷新绘制区域,而绘制区域是根据刷新时的时间动态变化的,这样就形成了动画。视图动画的实现与三个类密切相关,一个就是视图本身View.java,一个是Animation.java,还有一个是Transformation.java。本文分析这三个类在视图动画框架中的分工。首先我们分析View.java,回到区域刷新绘制的地方,drawAnimation()函数。

    private boolean drawAnimation(ViewGroup parent, long drawingTime,            Animation a, boolean scalingRequired) {        Transformation invalidationTransform;...        boolean more = a.getTransformation(drawingTime, parent.mChildTransformation, 1f);...                final RectF region = parent.mInvalidateRegion;                a.getInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop, region,                        invalidationTransform);//region的赋值...                final int left = mLeft + (int) region.left;                final int top = mTop + (int) region.top;                parent.invalidate(left, top, left + (int) (region.width() + .5f),//刷新调用                        top + (int) (region.height() + .5f));            }        }        return more;    }
这里从“刷新调用”处可以清楚的知道,视图动画动态的获取了region这一矩形区域的数据,从而实现的动画效果。那么重要的就是region的数据是如何更新的,如"region的赋值"处,它的数据更新在Animation.java的getInvalidateRegion()函数中:

    public void getInvalidateRegion(int left, int top, int right, int bottom,            RectF invalidate, Transformation transformation) {        final RectF tempRegion = mRegion;        final RectF previousRegion = mPreviousRegion;        invalidate.set(left, top, right, bottom);        transformation.getMatrix().mapRect(invalidate);//Transformation.java类的唯一应用,正是在这里影响了整个的绘制区域        // Enlarge the invalidate region to account for rounding errors        invalidate.inset(-1.0f, -1.0f);...    }
这里我们需要知道Transformation.java类的作用,这个类包含两个属性,一个是Matrix,一个是Alpha。这两个属性都是与图形密切相关的。上面这个函数中的invalidate就是前面调用中的region的形参,而transformation正是前面调用中的invalidationTransformation的形参。

    public boolean getTransformation(long currentTime, Transformation outTransformation) {        if (mStartTime == -1) {            mStartTime = currentTime;        }        final long startOffset = getStartOffset();        final long duration = mDuration;        float normalizedTime;        if (duration != 0) {            normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /                    (float) duration;        } else {            // time is a step-change with a zero duration            normalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;        }...            final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);            applyTransformation(interpolatedTime, outTransformation);        }

getTransformation()函数正是与刷新时间相关的函数,它根据时间改变Transformation中的Matrix或Alpha值。准确的来说这一功能是在applyTransformation()函数实现的,这是一个空函数,所有继承Animation.java类的子类都必须要实现这个函数,根据不同的实现方案得到了不同的动画。


0 0
原创粉丝点击