【问题标题】:Is Android double-tap-zoom animation or multi-step zooming?Android是双击缩放动画还是多步缩放?
【发布时间】:2013-12-19 18:34:16
【问题描述】:

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

如果使用缩放动画,由于动画是缓存绘图,这样放大有什么问题吗?

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

我应该只在动画完成后设置新的比例吗?

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

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

【问题讨论】:

    标签: android animation zooming android-view


    【解决方案1】:

    扩展 Animation 类并重写 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
        }
    }
    

    【讨论】:

    • 你能展示一些样品吗?这种方法是否适用于低 API 级别 (8)?
    • 谢谢!这真的是我想要的。但是,您忘记指定动画的持续时间,我尝试了 200 毫秒,效果很好。
    【解决方案2】:

    在等待最佳答案时,我自己尝试了“多步缩放”,结果很迷人。

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

    多步缩放是通过发布嵌套的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);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2022-08-12
      • 2017-03-09
      • 2012-09-26
      相关资源
      最近更新 更多