视图动画实现类的分工
2014-01-02 12:16
253 查看
视图动画的实现是不停的刷新绘制区域,而绘制区域是根据刷新时的时间动态变化的,这样就形成了动画。视图动画的实现与三个类密切相关,一个就是视图本身View.java,一个是Animation.java,还有一个是Transformation.java。本文分析这三个类在视图动画框架中的分工。首先我们分析View.java,回到区域刷新绘制的地方,drawAnimation()函数。
getTransformation()函数正是与刷新时间相关的函数,它根据时间改变Transformation中的Matrix或Alpha值。准确的来说这一功能是在applyTransformation()函数实现的,这是一个空函数,所有继承Animation.java类的子类都必须要实现这个函数,根据不同的实现方案得到了不同的动画。
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类的子类都必须要实现这个函数,根据不同的实现方案得到了不同的动画。
相关文章推荐
- iOS storyboard 实现动画,不用将视图拖到代码中
- android 视图动画的使用,Animation重写 实现旋转效果
- andoroid实现滑动上下滑动列表的时候动画隐藏其他视图
- iOS中动画的实现:以及视图的移动、缩放和旋转
- iOS:UIView的block函数实现转场动画---单视图
- Unity Mecanim动画的实现(八):Animation视图
- iOS项目开发实战——实现视图切换动画
- 在iOS利用动画实现全景视图
- iOS:UIView的block函数实现转场动画---双视图
- Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画
- 实现视图的动画
- 仿微信朋友圈实现共享视图元素的切换动画
- Swift - 通过设置视图的transform属性实现动画
- 【iOS开发-24】导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- IOS中动画的实现:以及视图的移动、缩放和旋转
- 2014-11-3Android学习------关于自定义视图View的时候需要调用onMeasure--------GIF动画实现
- Android中一个视图弹出动画的简单实现
- UIImageView 与 CABasicAnimation 实现多层视图,带动画效果objec iOS
- iOS开发导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- 源码分析视图动画是如何实现的