您的位置:首页 > 其它

视图动画实现类的分工

2014-01-02 12:16 253 查看
视图动画的实现是不停的刷新绘制区域,而绘制区域是根据刷新时的时间动态变化的,这样就形成了动画。视图动画的实现与三个类密切相关,一个就是视图本身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类的子类都必须要实现这个函数,根据不同的实现方案得到了不同的动画。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: