视图动画实现类的分工
来源:互联网 发布:淘宝找不到自己的店铺 编辑:程序博客网 时间: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
- 视图动画实现类的分工
- 实现视图的动画
- 实现视图的切换(动画)
- Twisted-Factory和Protocol类的分工
- android 视图动画的使用,Animation重写 实现旋转效果
- 源码分析视图动画是如何实现的
- iOS -UI-视图创建及动画的实现
- 仿微信朋友圈实现共享视图元素的切换动画
- Unity Mecanim动画的实现(八):Animation视图
- Unity Mecanim动画的实现(八):Animation视图
- 属性动画和视图动画的区别
- 动画之视图动画--ViewAnimation的学习
- 我的项目分工
- 游戏美工的分工
- 测试工程师的分工
- 关于模块的分工
- MVC的职责分工
- NSViewAnimation视图的简单动画
- iOS学习之UINavigationController详解与使用(三)ToolBar
- html5 拖拽
- android保存资源文件File的方法
- Javascript中常见的校验
- linux的时区名字列表位于目录/usr/share/zoneinfo下。
- 视图动画实现类的分工
- 使用Paint事件重画GroupBox来修改边框颜色
- DedeCms模板 如何防被盗以及安全设置的一些方法
- iOS App Launch Option
- CAP原理与最终一致性
- Linux下NFS(网络文件系统)的安装与配置方法
- iOS 从url中获取文件名以及后缀
- Lizcst Software Lab 正式入驻新华军软件商城——华商团!
- iptables 命令详解