Search

Android - Tweener Parallel Timeline

2015-05-29 3:10 PM

在打造使用者互動特效時

並不會一次只動作一個物件

例如點擊後可能有按鈕特效加上我們自訂的光影特效

或是點擊後出現的物件特效等等

若是想同時啟動這些特效則可使用本單元介紹的 Parallel Timeline

與多個 Tweener 不同的是 Timeline 可以將一系列特效儲存起來

之後使用 start 方法即可直接啟動特效

算是製作大型互動特效的一大利器

程式碼範例
  1. Timeline.createSequence()
  2. // 首先設定所有物件的初始狀態(座標, 透明度等等)
  3. .push(Tween.set(...))
  4. .push(Tween.set(...))
  5. .push(Tween.set(...))
  6.  
  7. // delay 1秒鐘
  8. .pushPause(1.0f)
  9.  
  10. // 加入不同的 Tweener, 此處會依照加入的順序, 在上一個特效結束時動作
  11. .push(Tween.to(...))
  12. .push(Tween.to(...))
  13. .push(Tween.to(...))
  14.  
  15. // 此處即為加入同時動作的 Tweener
  16. .beginParallel()
  17. .push(Tween.to(...))
  18. .push(Tween.to(...))
  19. .push(Tween.to(...))
  20. .end()
  21.  
  22. // Yo yo 效果, 將會重複播放此 Timeline 內的特效 2 次, 並在重複開始前 delay 0.5 秒
  23. .repeatYoyo(2, 0.5f)
  24.  
  25. // 啟動 Timeline
  26. .start(myManager);
各項資料連結
Universal Tween Engine(Google Code)
Universal Tween Engine(GitHub)

Android - Tweener 的 Accessor

2015-05-23 9:17 PM

Accessor 是針對 Java 特性加入的一個 Interface

Tweener 需要依靠實作此 Interface 的 Class 來渲染動畫效果

程式碼範例
  1. public class ButtonAccessor implements TweenAccessor<Button> {
  2.  
  3. // 自訂義 Tween 類型, 用以判別在實作的 Method 內需處理的對象
  4. public static final int POSITION = 1;
  5. public static final int ALPHA = 2;
  6.  
  7. @Override
  8. public int getValues(Button target, int tweenType, float[] returnValues) {
  9. switch (tweenType) {
  10. case POSITION:
  11. // 由物件內取回實際值
  12. returnValues[0] = target.getX();
  13. returnValues[1] = target.getY();
  14. // 修改 2 個屬性, 因此回傳 2
  15. return 2;
  16. case ALPHA:
  17. returnValues[0] = target.getAlpha();
  18. // 修改 1 個屬性, 回傳 1
  19. return 1;
  20. default:
  21. return -1;
  22. }
  23. }
  24.  
  25. @Override
  26. public void setValues(Button target, int tweenType, float[] newValues) {
  27. switch (tweenType) {
  28. case POSITION:
  29. // 設定新屬性
  30. target.setX(newValues[0]);
  31. target.setY(newValues[1]);
  32. break;
  33. case ALPHA:
  34. // 設定新屬性(需對應 getValues 的設定)
  35. target.setAlpha(newValues[0]);
  36. break;
  37. default:
  38. break;
  39. }
  40. }
各項資料連結
Universal Tween Engine(Google Code)
Universal Tween Engine(GitHub)

Android - 使用 Tweener 加入互動特效

9:11 PM

以往在撰寫 Flash 及網頁時

若要加入互動效果,我們常常會使用一個叫做 Tweener 的引擎

使用 Tweener 後可以很容易地達成物件的移動與淡出淡入等特效

如此一來就可以增加介面的互動效果達到更好的使用者體驗

以下就來介紹如何在 Android 內使用 Tweener

首先須下載 Universal Tween Engine

程式碼範例

首先須宣告 TweenManager 以及控制 Renderer 的 boolean 值

  1. // 所有 Tweener 皆須傳入此 Manager
  2. private final TweenManager tweenManager = new TweenManager();
  3.  
  4. // 設為 false 則停止 renderer
  5. private boolean isAnimationRunning = true;

新增一個多執行緒的 renderer (可在 onCreate 或 onResume 內新增) 並註冊 Accessor

  1. // 註冊各類別處理器
  2. Tween.registerAccessor(Button.class, new ButtonAccessor());
  3.  
  4. // Renderer
  5. new Thread(new Runnable() {
  6. private long lastMillis = -1;
  7.  
  8. @Override
  9. public void run() {
  10. while (isAnimationRunning) {
  11. if (lastMillis > 0) {
  12. long currentMillis = System.currentTimeMillis();
  13. final float delta = (currentMillis - lastMillis) / 1000f;
  14.  
  15. runOnUiThread(new Runnable() {
  16. @Override public void run() {
  17. tweenManager.update(delta);
  18. }
  19. });
  20.  
  21. lastMillis = currentMillis;
  22. } else {
  23. lastMillis = System.currentTimeMillis();
  24. }
  25.  
  26. try {
  27. // 60 FPS
  28. Thread.sleep(1000/60);
  29. } catch(InterruptedException ex) {
  30. }
  31. }
  32. }
  33. }).start();

之後便可任意呼叫 Tweener 以及 Timeline

  1. Tween.to(loginBtn, ButtonAccessor.ALPHA, 0.1f).target(0.5f).ease(Quad.OUT).start(tweenManager);
  2.  
  3. Timeline.createSequence()
  4. .push( Tween.to(loginBtn, ButtonAccessor.ALPHA, 0.1f).target(0.1f).ease(Quad.OUT) )
  5. .push( Tween.to(loginBtn, ButtonAccessor.ALPHA, 0.3f).target(1).ease(Quad.OUT) )
  6. .start(tweenManager);
各項資料連結
Universal Tween Engine(Google Code)
Universal Tween Engine(GitHub)