2013-12-19 51 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); 
      } 
     } 
    } 
}