曲线移动专题.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
曲线移动专题

Android自定义动画之曲线轨迹 在View Animation中通常是实现translate、alpha、scale和rotate其中的一种或多种(可以通过写代码或者配置XML实现, 其实结果最终都是一样的)。参考docs和 samples可以很快实现基本动画。但是有时候我们需要的比这些基础功能要稍微复杂点的东西,那么就需要我们来扩展了。 现在我们来实现一个运动轨迹是曲线的动画,基础的translate动画的运动轨迹是点到点的,直线的。在View Animation中就需要自己定义一个动画来实现了,TranslateAnimation的运动轨迹是直线,既然我们需要曲线的轨迹,那么想当然我们 只需要修改部分代码就可以了。但是TranslateAnimation类中我们所需的变量和方法都是private和protected的,所以就可以继承Animation类,重写所需的方法即可。首先定义一个可以曲线的移动的TranslateAnimation类。 重写的方法包括applyTransformation()方法和initialize()方法,以及要定义一个calcBezier()方法。其中最为核心的是自定义的calcBezier()方法,这个方法用来计算出各个点坐标(起点、控制点、终点)所对应的符合贝兹曲线二阶方程的坐标。下面我们详细介绍各个方法的原理。 initialize()通过resolveSize()方法来得到融合后的点坐标,然后初始化了最重要的动画运动的起始点、控制点和终点的对象。initialize()方法执行时首先会调用父类的初始化方法initialize(),父类的初始化方法中定义了一个reset()方法,用于在在初始化之前将之前的状态重置。接着执行下面的resolveSize()方法。resolveSize()是TranslateAnimation的父类Animation类中的方法,点坐标类型以ABSOLUTE 为例,我们可以看到方法中直接返回的结果是value,也就是点x轴或y轴的原值。下面是源码: protected float resolveSize(int type, float value, int size, int parentSize) { switch (type) { case ABSOLUTE: return value; case RELATIVE_TO_SELF: return size * value; case RELATIVE_TO_PARENT: return parentSize * value; default: return value; } 这样就得到了融合后的三点的坐标,然后创建这三点的PointF对象。PointF与Point完全相同,但X和Y属性的类型是float,而不是int。PointF用于坐标不是整数值的情况。 接下来系统会不断地回调applyTransformation()方法,在动画进行的过程中,每次调用,这个方法通过对象Transformation的getMarix()传进来一个变换矩阵(就是动画的模型,可以对对象进行几种基本转换的处理,如平移转换、旋转转换等。而且这个矩阵会随着interpolatedTime的增长不断变化),通过对这个矩阵的操作,我们就可以实现自己的动画效果了。但是在这之前我们要得到能让矩阵(在这里就是图片的模型)曲线移动的方法setTranslate(float dx,float dy)中的两个参数dx和dy,这就要用到自定义的calcBezier()方法。 我们需要一个公式( HYPERLINK /wiki/B%C3%A9zier_curve \t _blank 贝兹曲线)。简单的介绍一下,这个公式在图形学中非常有用,线性、二次或者高阶曲线代表不同的曲线类别,比如直线、抛物线或者波形线。我们用二阶为例,需要注意的就是一个拐点的问题,我们称为控制点,这个控制点选取的不一样,出来的曲线效果就不一样。 二次方程贝兹曲线的路径可以公式化为有三个定点P0、P1、P2的函数B(t): B(t) = (1-t)2P0 +2t(1-t)P1+t2P2, t∈[0,1] 其中的t为interpolatedTerpolatedTime表示的是当前动画的间隔时间,范围是0-1,也就是二次方程贝兹曲线的t。这里通过间隔时间interpolatedTime表示这个闭区间:[0,1]。代表当前方法被

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档