当前位置:首页 >> 政史地 >>

曲线移动专题


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轴的原值。下面是源码: protectedfloatresolveSize(int type, float value, int size, intparentSize) { switch (type) { caseABSOLUTE: return value; caseRELATIVE_TO_SELF: return size * value; caseRELATIVE_TO_PARENT: returnparentSize * value; default: return value; } 这样就得到了融合后的三点的坐标, 然后创建这三点的 PointF 对象。 PointF 与 Point 完全相同, 但 X 和 Y 属性的类型是 float,而不是 int。PointF 用于坐标不是整数值的情况。 接下 来 系统 会 不断 地 回 调 applyTransformation()方 法 ,在 动 画进 行 的 过程 中 ,每 次调 用 ,这个 方 法 通 过 对 象 Transformation 的 getMarix()传 进来 一 个 变 换矩 阵( 就是 动画 的 模型 ,可 以对 对 象 进行 几 种基 本 转换 的 处理 ,如平 移 转换 、旋 转转 换 等 。而 且 这 个矩 阵 会 随 着 interpolatedTime 的增 长 不断 变 化 ), 通 过对 这 个矩 阵 的操 作, 我 们就 可以 实 现自 己 的动 画 效果 了。 但 是在 这 乊前 我 们要 得到 能 让矩 阵 (在这 里 就 是图 片 的模 型)曲 线 移动 的 方法 setTranslate(float dx,float dy)中 的 两个 参 数 dx 和 dy, 这就 要 用到 自 定义 的 calcBezier()方法 。

我们 需 要一 个 公式 (贝 兹 曲线 )。 简单 的 介绍 一 下 ,这 个 公式 在 图形 学 中非 常有 用 , 线性 、二 次戒 者 高阶 曲 线 代表 不 同的 曲 线类 别 ,比 如直 线 、抛物 线 戒者 波 形 线 。我 们 用 二阶 为 例 ,需要 注 意的 就 是一 个 拐点 的 问题 ,我 们 称为 控 制点 ,这 个 控制 点 选取 的 不一 样, 出 来的 曲 线效 果 就不 一样 。 二次 方 程贝 兹 曲线 的 路径 可以 公 式化 为 有三 个 定 点 P0、 P1、P2 的 函数 B(t): B(t) = (1-t)?P0 +2t(1-t)P1+t?P2, t∈[0,1] 其中 的 t 为 interpolatedTime。 interpolatedTime 表示 的 是当 前 动画 的 间隔 时间 , 范围 是 0-1,也 就是 二 次 方程 贝 兹曲 线 的 t。这里 通过 间 隔时 间 interpolatedTime 表示 这个 闭 区间 :[0,1]。代 表 当前 方 法 被 调 用时 ,动画 进行 的 一个 时 间点 ,这个 值的 范 围是 0 到 1, 也 就是 说 动画 刚 开 始的 时 候传 进 来的 interpolatedTime 为 0, 动画 进行 中 的时 候, 传 进来 的 是 0 到 1 乊 间的 浮 点数 , 动画 结 束的 时候 传 进来 的 是 1。 假设 三 个点 P0、P1、P2,公 式 参照 贝 兹曲 线 二阶 公式 。 计算 的 Java 代 码 如下 : privatelongcalcBezier(floatinterpolatedTime, float p0, float p1, float p2){ returnMath.round((Math.pow((1 - interpolatedTime), 2) * p0) + (2 * (1 - interpolatedTime) * interpolatedTime * p1) + (Math.pow(interpolatedTime, 2) * p2)); } 这里 就 是把 公 式转 化 成 了 Java 代码 ,没 有 任何 其它 的 加工 。在 这 个例 子 中我 们 控 制点 为(mFromXDelta, mToYDelta),这里 有 个 建议 戒 者说 是 常用 的 就是 通常 用 起点 和 终点 的 切线 的 交点 来 做为 控制 点,当 然控 制 点你 可 以自 己 选择 ,按 照 自己 的 想法 用 公式 计算 出 来。 最后 执 行回 调 方法 中 的 t.getMatrix().setTranslate(dx, dy)方法 完 成 动画 开 启前 的所 有 工作 。 调用 ImageView 下 的 startAnimation()方法 开 启动 画 。

注释: 矩阵:矩阵是由 个数组成的一个 行 列的矩形表格。在 Android 中进行图像操作时需要使用 Matrix,看源码会发现这个类里面有 9 个参数,因为它包含了一个 3*3 的矩阵,如下图。用于 进行图像变换匹配。在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。Matrix 没 有机构体,它必须刜始化,而且这个矩阵会随着 interpolatedTime 的增长不断变化。

Interpolated:Android 动画乊 Interpolator 插入器 ——AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。

——DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。 ——CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。 ——AccelerateDecelerateInterpolator: 动画从开始到结束, 变化率是先加速后减速的过 程。 ——LinearInterpolator:动画从开始到结束,变化率是线性变化。 AccelerateInterpolator 有一个方法:getInterpolation(float input) 源码: public float getInterpolation(float input) { if (mFactor == 1.0f) { return input * input; } else { return (float)Math.pow(input, mDoubleFactor); } }

Math.pow 的意思是 input 的 mDoubleFactor 次方,那么如果 input 不断变大的话, return 的数目就越来越大.而且是加速的.这样就成了加速动画.其他的其次类推.

用处:比如你自己定义一个动画,用线程不断的刷新让一个东西旋转戒者移动,你就可以用这个函 数把输入的值变化一下再给真正处理动画刷新的函数,这样就可以看到加速和减速等效果.


相关文章:
曲线运动经典专题复习
曲线运动经典专题知识要点:一、曲线运动三要点 1、条件:运动方向与所受合力不在同一直线上, 2、特点: (1)速度一定是变化的——变速运动 (2) 加速度一定不为...
高中物理曲线运动专题
松柏教育【松柏教育内部资料】 【一对一高中物理】 主讲:高毓阳 曲线运动专题 曲线运动专题●平抛运动; ●圆周运动,向心力,向心加速度; ●万有引力例题一:...
曲线运动的专题复习
曲线运动专题复习一(一)曲线运动中的几个问题 1.曲线运动的条件:合外力与速度不共线 2.运动的合成和分解 1.关于运动的性质,以下说法中正确的是( A.曲线运动...
曲线运动经典专题
曲线运动经典专题_理化生_高中教育_教育专区。曲线运动经典专题知识要点: 一、 曲线运动三要点 1、条件:运动方向与所受合力不在同一直线上, 2、特点: (1)速度...
曲线运动经典专题
曲线运动经典专题知识要点:一、曲线运动三要点 1、条件:运动方向与所受合力不在同一直线上, 2、特点: (1)速度一定是变化的——变速运动 (2)加速度一定不为零...
曲线移动专题
曲线移动专题_政史地_高中教育_教育专区。Android 自定义动画乊曲线轨迹在 View Animation 中通 常是 实现 translate、alpha、scale 和 rotate 其中 的一 种 戒多...
高三综合复习曲线运动专题
高三综合复习曲线运动专题 ●知识网络 知识网络 ●高考考点 高考考点 考纲要求: 考纲要求: 要 知识点 求 运动的合成和分解 曲线运动中质点的速度沿轨道的切线方向...
曲线运动专题
曲线运动专题_理化生_高中教育_教育专区。专题:曲线运动【考情分析】力与曲线运动是力学中非常重要的内容,是高考热点之一.考查的知识点有:对平抛运动的理解 及综...
曲线运动专题
曲线运动专题_理化生_高中教育_教育专区。曲线运动经典专题知识要点:一、曲线运动三要点 1、条件:运动方向与所受合力不在同一直线上, 2、特点: (1)速度一定是变...
更多相关标签:
圆锥曲线离心率专题 | 高中物理曲线运动专题 | 圆锥曲线专题 | 圆锥曲线专题训练 | 双曲线专题 | 圆锥曲线专题复习 | 直线与圆锥曲线专题 | 高考数学圆锥曲线专题 |