android Animation 动画绘制逻辑
参考:http://www.jianshu.com/p/3683a69c38ea
1、View.draw(Canvas) 其中步骤为:
/*
* Draw traversal performs several drawing steps which must be executed
* in the appropriate order:
*
* 1. Draw the background
* 2. If necessary, save the canvas' layers to prepare for fading
* 3. Draw view's content
* 4. Draw children
* 5. If necessary, draw the fading edges and restore layers
* 6. Draw decorations (scrollbars for instance)
*/
2、ViewGroup.dispatchDraw(Canvas);如果控件为ViewGroup或者其子类,需要绘制子类
3、ViewGroup.drawChild(Canvas canvas, View child, long drawingtime) 4、View.draw(Canvas canvas, ViewGroup parent, long drawingTime); 这个方法里面实现动画
// 如下代码段获取Animation的矩阵、alipa等值
if (a != null) {
more = applyLegacyAnimation(parent, drawingTime, a, scalingRequired);
concatMatrix = a.willChangeTransformationMatrix();
if (concatMatrix) {
mPrivateFlags3 |= PFLAG3_VIEW_IS_ANIMATING_TRANSFORM;
}
transformToApply = parent.getChildTransformation();
} // 主要方法为 applyLegacyAnimation,其代码段
final Transformation t = parent.getChildTransformation(); // 取出父控件保存的Transformation 对象
boolean more = a.getTransformation(drawingTime, t, 1f); // 用animation中的矩阵变化值填充 对象t; 其中a为程序员设置的动画对象
// Animation 的 getTransformation代码段
final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);
applyTransformation(interpolatedTime, outTransformation); // 具体填充传入参数Transformation的方法,它是一个空方法,具体实现由子类负责 //例如:RotateAnimation 的 applyTransformation 方法,其中代码段:
float degrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime);
float scale = getScaleFactor(); if (mPivotX == 0.0f && mPivotY == 0.0f) {
t.getMatrix().setRotate(degrees);
} else {
t.getMatrix().setRotate(degrees, mPivotX * scale, mPivotY * scale); // 将旋转角度设置到transformation的矩阵中,其他子类也是相似逻辑
}
// View.draw( , , )真正实现动画的代码段:
canvas.translate(-transX, -transY);
canvas.concat(transformToApply.getMatrix()); // 将从动画中取出的矩阵,传递给canvas实现动画效果
canvas.translate(transX, transY); // View.draw(, ,)关键代码段:
// Fast path for layouts with no backgrounds
if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) {
mPrivateFlags &= ~PFLAG_DIRTY_MASK;
dispatchDraw(canvas); //
} else {
draw(canvas);// 执行动画变换之后,接着绘制视图
}
结论:
1、Animation 动画中起关键作用的类是Transformation, animation负责计算动画的矩阵变换,Transformation负责将变换传递给Canvas.
2、Animation 动画只是对Canvas做了矩阵变换,并没有修改其属性值,这是它和属性动画的最大区别。
3、Alpha值的修改也在draw方法中保存了图层,不影响属性值
android Animation 动画绘制逻辑的更多相关文章
- Android Animation动画实战(二):从屏幕底部弹出PopupWindow
在这篇文章之前,我已经陆陆续续写了几篇博客,介绍了Android Animation是如何使用的,有还不明白的,可以点击查看: 1. Android Animation动画详解(一): 补间动画 2. ...
- Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画
前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android An ...
- Android Animation动画详解(二): 组合动画特效
前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...
- [Android]Animation 动画介绍和实现
Animation动画效果来实现菜单的显示和隐藏,本文就来介绍下吧. 1.Animation 动画类型 Android的animation由四种类型组成: XML中 alph 渐变透明度动画效果 sc ...
- Android Animation 动画属性
在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现: 一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...
- Android Animation动画(很详细)
Android Animation Contents: Animations Tween Animations AnimationSet Interpolator Frame-By-Frame A ...
- android Animation动画的xml使用
在Android应用程序,使用动画效果,能带给用户更好的感觉,做动画能够通过XML或Android代码来实现. Animation动画效果的实现能够通过两种方式进行实现,一种是tweened anim ...
- Android Animation 动画Demo(Frame帧动画)
上一页介绍Animation动画第一:Tween吐温动画. 本文介绍了以下Animation也有动画的形式:Frame帧动画. Frame动画是一系列照片示出的顺序按照一定的处理,和机制,以放电影很阶 ...
- Android Animation动画详解(一): 补间动画
前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...
随机推荐
- 1.3 Content Provider
ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 使用方式:一个应用实现ContentProvider来提供内 ...
- 原生js运动框架
function getStyle(obj,name){ if(obj.currentStyle) { return obj.currentStyle[name]; } else { return g ...
- centos使用jexus支持php小记录
安装php(文章参考http://linuxdot.net/bbsfile-3132) yum install php 1)修改“/etc/php.ini”文件(有的位置在/etc/php5/cgi/ ...
- glRotate函数
void glRotate( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) API说明:angle为旋转角度,单位为度:x,y,z是旋转轴的 ...
- Heartbeat的两个小BUG
1,heartbeat启动不起来 如果你是用了linux-ha.japan里面的repo文件,Yum安装pacemaker+heartbeat时. 可能会发现打了service heartbeat s ...
- B-tree&B+tree
B-tree&B+tree B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的 ...
- [JS4] 最简单JS框架
<html> <head> <title></title> <SCRIPT TYPE="text/JavaScript"> ...
- JsRender实用教程(tag else使用、循环嵌套访问父级数据)
前言 JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点: · 简单直观 · 功能强大 · 可扩展的 · 快如闪电 这些特性看起来很厉害,但几乎每个模版引擎, ...
- 西安.NET俱乐部群 推广代码
CSS: .gallery-item { display:inline-block; margin: 15px; } 个人签名: <div class="gallery&quo ...
- iOS YSAuth 第三方登录及分享
概述 在很多时候,我们使用的都是第三方插件来处理登录与分享,比如使用友盟.但要是我们需要自己写一套自己的登录.分享.支付的时候,就可以使用YSAuth这个类库. github:https://gith ...