2013-12-19 74 views
0

有沒有人知道在普通的Android應用程序(如網頁視圖或圖像視圖)上的雙擊縮放功能是通過縮放動畫完成的,還是通過將縮放分成小步驟並逐一執行?Android是雙擊縮放動畫還是多步縮放?

如果使用縮放動畫,由於動畫是緩存繪圖,當我這樣放大時,是否有任何問題?

mView.zoomTo(newScale); 
mView.startAnimation(zoomInAnimation); 

我應該只在動畫完成後設置新比例嗎?

如果使用多個縮放步驟,這真的是一個很好的方法嗎?如何執行每一步?多次發送消息?

什麼是雙擊平滑放大/縮小的最佳方式?

回答

1

擴展動畫類並覆蓋applyTransformarion方法,使用interpolatedTime參數來計算當前的縮放級別

編輯 ,因爲它可以很簡單,跟真的古老機器人的工作原理:

public class ZoomAnimation extends Animation { 
    private float mFrom; 
    private float mTo; 

    public ZoomAnimation(float from, float to) { 
     mFrom = from; 
     mTo = to; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     float currentZoom = mFrom + ((mTo - mFrom) * interpolatedTime); 
     // do something with currentZoom 
    } 
} 
+0

莫非你請展示一些樣品?這種方法在低API水平(8)上可用嗎? – Robin

+0

查看已編輯的答案 – pskink

+0

謝謝!這真的是我想要的。然而,你忘了指定動畫的持續時間,我嘗試了200ms,它完美的作品。 – Robin

0

在等待最佳答案時,我自己嘗試了「多步縮放」,結果變得迷人。

如果有人能給出更好的答案,我會接受你的。

通過發佈嵌套的Runnable實例來執行多步縮放,mCanvasScale是用於控制視圖繪製的字段。 setZoomValue()正在設置mCanvasScale並調用invalidate()。

public void smoothScaleTo(final float targetScale) { 
    if(targetScale != mCanvasScale) { 
     post(new SmoothScaleExecutor(mCanvasScale, targetScale)); 
    } 
} 

private class SmoothScaleExecutor implements Runnable { 
    public static final int SMOOTH_SCALE_STEPS = 4; 

    private float mStartingScale; 
    private float mTargetScale; 
    private float mScaleStep; 

    public SmoothScaleExecutor(float startingScale, float targetScale) { 
     mStartingScale = startingScale; 
     mTargetScale = targetScale; 
     mScaleStep = (targetScale - startingScale)/SMOOTH_SCALE_STEPS; 
    } 
    @Override 
    public void run() { 
     if(mStartingScale < mTargetScale) { 
      if(mCanvasScale < mTargetScale) { 
       float f = mCanvasScale + mScaleStep; 
       if(f > mTargetScale) f = mTargetScale; 
       setZoomValue(f); 
       post(this); 
      } 
     } else { 
      if(mCanvasScale > mTargetScale) { 
       float f = mCanvasScale + mScaleStep; 
       if(f < mTargetScale) f = mTargetScale; 
       setZoomValue(f); 
       post(this); 
      } 
     } 
    } 
}