Android双击缩放动画还是多步缩放?

时间:2013-12-19 07:28:05

标签: android animation zoom android-view

有没有人知道普通Android应用程序(如网页视图或图像视图)上的双击缩放功能是通过缩放动画或将缩放分成小步骤并逐个执行来实现的?

如果使用缩放动画,因为动画是缓存绘图,当我这样放大时是否有任何问题?

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

我应该只在动画结束后设置新比例吗?

如果使用多个缩放步骤,这真的是一个好方法吗?如何执行每一步?多次发送消息?

双击时进行平滑放大/缩小的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

扩展Animation类并覆盖applyTransformarion方法,使用interpolatedTime参数计算当前缩放级别

EDIT 尽可能简单,适用于非常古老的机器人:

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
    }
}

答案 1 :(得分: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);
            }
        }
    }
}