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方法中保存了图层,不影响属性值
时间: 2024-08-21 23:44:47

android Animation 动画绘制逻辑的相关文章

Android Animation 动画Demo(Frame逐帧动画)

上一篇介绍了Animation动画其一:Tween补间动画. 这篇文章接下来介绍Animation另一种动画形式:Frame逐帧动画. Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现(后面会给出这两种实现方式的源代码Demo). 下面分别介绍: 一.定义在xml中实现: 实现效果图: 源代码: 布局文件:main.xml: <?xml version="1.0" encodin

Android Animation动画(很详细)

http://www.360doc.com/content/13/0102/22/6541311_257754535.shtml Android Animation动画(很详细),布布扣,bubuko.com

Android Animation动画详解(二): 组合动画特效

前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一番,然后再过来跟着我一起学习如何把简单的动画效果组合在一起,做出比较酷炫的动画特效吧. 一. 动画的续播 如题,大家想想,如果一个页面上包含了许多动画,这些动画要求按顺序播放,即一个动画播放完成后,继续播放另一个动画,使得这些动画具有连贯性.那该如何实现呢? 有开发经验或者是逻辑思维的人肯定会想,对

Android Animation 动画

动画类型 Android的animation由四种类型组成  Android动画模式 Animation主要有两种动画模式:一种是tweened animation(渐变动画) XML中 JavaCode alpha AlphaAnimation scale ScaleAnimation 一种是frame by frame(画面转换动画) XML中 JavaCode translate TranslateAnimation rotate RotateAnimation 如何在XML文件中定义动画

Android Animation动画实战(一): 从布局动画引入ListView滑动时,每一Item项的显示动画

前言: 之前,我已经写了两篇博文,给大家介绍了Android的基础动画是如何实现的,如果还不清楚的,可以点击查看:Android Animation动画详解(一): 补间动画 及 Android Animation动画详解(二): 组合动画特效 . 已经熟悉了基础动画的实现后,便可以试着去实现常见APP中出现过的那些精美的动画.今天我主要给大家引入一个APP的ListView的动画效果: 当展示ListView时,Listview的每一个列表项都按照规定的动画显示出来. 说起来比较抽象,先给大家

Android Animation 动画属性

在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现: 一种是 tweened animation 渐变动画,另一种是 frame by frame animation 补间(画面转换)动画. tweened animation 渐变动画有以下两种类型: 1.alpha   渐变透明度动画效果 2.scale   渐变尺寸伸缩动画效果 frame by frame animation 画面转换动画有以下两种类型: 1.translate  画面转换位置移动动画效果

Android Animation 动画Demo

本文主要介绍Android中的Animation动画. Android提供了2中动画:Tween动画和Frame动画. 本文中主要讲解Tween动画,下篇文章中会讲到Frame动画. Tween动画: 通过对View的内容进行一系列的图形变换(包括平移,缩放,旋转,改变透明度)来实现动画的效果,动画效果的定义可以采用XML方式也可以采用编码来做Tween动画(文章最后会给出两种方式动画的源代码Demo). 动画的类型 Xml定义动画使用的配置节点 编码定义动画使用的类 渐变透明度动画效果(简称透

Android Animation (动画设计)

Android Animation(动画设计) 本文主要介绍逐帧动画,补间动画,属性动画 使用简单的图片 1.Bitmap和BitmapFactory 把一个Bitmap包装成BitmapDrawable对象,调用BitmapDrawable的构造器 BitmapDrawable drawable = new BitmapDrawable(bitmap); 获取BitmapDrawable所包装的Bitmap, Bitmap bitmap = drawable.getBitmap(); 2.Bi

Android Animation动画的xml使用

在Android应用程序,使用动画效果,能带给用户更好的感觉,做动画可以通过XML或Android代码来实现. Animation动画效果的实现可以通过两种方式进行实现,一种是tweened animation (渐变动画),另一种是frame by frame animation (画面转换动画). tweened animation渐变动画有以下两种类型: 1.alpha     渐变透明度动画效果 2.scale    渐变尺寸伸缩动画效果 frame by frame animation