java 板


LINE

在〈GWT Animation 初探〉当中,程式已经能让画面看起来有动画的效果, 「表面上」要怎麽使用 Animation 是没有问题了; 不过这样子有些无趣,还是要杀进去 Animation 来了解这一切背後的内幕(?)。 起点当然是 Animation.run(),没有呼叫这个 method,是不会有什麽反应的。 run() 有两个,run(int duration, double startTime) 的 duration 是 Animation 预计持续作用的时间; startTime 是预计执行的时间。 为甚麽用 startTime 的 data type 是 double 呢? 这点在 Animation 不算是有用到的 Duration.elapsedMillis() 可以找到答案: Returns the same result as System#currentTimeMillis(), but as a double. Because emulated long math is significantly slower than doubles in web mode, this method is to be preferred. 因为在浏览器上头,使用 double 处理起来比模拟 long 还要快得多 (btw... 为甚麽 Animation 只用了 Duration.currentTimeMillis() 取得时间, 而没有用 Duration.elapsedMillis() 去计算时间差,这我一直想不透 XD)。 另一个 run(int duration) 其实还是呼叫 run(int, double), 只是自动以当下时间传给 startTime。 回到 run(int, double) 的内容,关键点在於下面这段 if (animations == null) { animations = new ArrayList(); //point-A animationTimer = new Timer() { @Override public void run() { updateAnimations(); } }; } animations.add(this); 这边要回头看一下 Animation 的资料结构。 讲起来有点饶舌。大致上来说,Animation 有一些 static 的 field 跟 method, 目的是统一处理系统当中所有的 Animation object(程式码 point-A)。 这里也可以看到,其实 Animation 里头是用 Timer 来实做的。 Timer 的细节得先跳过,这里只要知道看到 animationTime.schedule(int delayMillis) 就表示隔了 delayMillis 个 ms 就会执行 updateAnimations() 的内容, 而 updateAnimations() 会呼叫 update()。 那麽,势必有需要好好看一下 update() 的内容: private boolean update(double curTime) { boolean finished = curTime >= startTime + duration; if (started && !finished) { // Animation is in progress. double progress = (curTime - startTime) / duration; onUpdate(interpolate(progress)); return false; } if (!started && curTime >= startTime) { // Start the animation. started = true; onStart(); // Intentional fall through to possibly end the animation. } if (finished) { // Animation is complete. onComplete(); started = false; running = false; return true; } return false; } 里头依照不同的状况,呼叫了 onUpdate(), onStart() 跟 onComplete()。 嗯?为甚麽只有 onUpdate() 是 abstract 的呢? 因为另外两个到最後还是去呼叫 onUpdate(), progress 的值给 0 表示刚开始、给 1 表示结束。 接下来就是最诡异的部份啦,传给 onUpdate() 的数值, 居然还要经过 interpolate() 的计算,这又是为甚麽呢? 根据 javadoc 的说法: Interpolate the linear progress into a more natural easing function. 看个对照图可能比较好懂: http://rubyurl.com/iVP9 在开始跟结束的部份比较缓和,或许这样比较符合人类视觉观点? 总之,这是为甚麽 Animation 的 javadoc 会说「at a non-fixed frame rate」了。 (顺带提一点,相同的 duration,呼叫 onUpdate() 的次数应该会一样, 但是 progress 值会有差异。这应该是 Timer 先天上无法很精准的缺陷?) 看到这边,Animation 应该可以说没有秘密了。 剩下来就是如何运用的问题了...... [远目] ==== 资料来源:http://pt2club.blogspot.com/2009/10/gwt-animation_07.html -- 侃侃长论鲜窒碍 首页:http://www.psmonkey.idv.tw 众目睽睽无心颤 Blog:http://ps-think.blogspot.com 茕居少聊常人事 杀头容易告白难 欢迎参观 Java 版(@ptt.cc) \囧/ --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.231.90.248







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP