【问题标题】:android pinch zoom安卓捏缩放
【发布时间】:2011-07-19 13:11:15
【问题描述】:

我的布局包含按钮、文本视图等。是否可以在我的布局中实现捏缩放?

【问题讨论】:

    标签: android pinchzoom zooming


    【解决方案1】:

    更新答案

    代码可以在这里找到:official-doc

    答案过时

    查看以下可能对您有所帮助的链接

    以下链接中提供了最佳示例,您可以对其进行重构以满足您的要求。

    1. implementing-the-pinch-zoom-gestur

    2. Android-pinch

    3. GestureDetector.SimpleOnGestureListener

    【讨论】:

    • 一旦链接断开,这个答案将毫无价值。至少引用相关部分。
    • 仅供参考,这个答案已经过时了。从 API 8 开始,ScaleGestureDetector 是 Android 对双指缩放的回答。请参阅 Emanuel's answer
    【解决方案2】:

    对于android 2.2+ (api level8),你可以使用ScaleGestureDetector。

    你需要一个会员:

    private ScaleGestureDetector mScaleDetector;
    

    在您的构造函数(或 onCreate())中添加:

    mScaleDetector = new ScaleGestureDetector(context, new OnScaleGestureListener() {
        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
        }
        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            return true;
        }
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            Log.d(LOG_KEY, "zoom ongoing, scale: " + detector.getScaleFactor());
            return false;
        }
    });
    

    您覆盖 onTouchEvent:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mScaleDetector.onTouchEvent(event);
        return true;
    }
    

    如果你手动绘制你的视图,你可能会在 onScale() 中将比例因子存储在一个成员中,然后调用 invalidate() 并在你的 onDraw() 中绘制时使用比例因子。 否则,您可以直接在 onScale() 中修改字体大小或类似的内容。

    【讨论】:

    【解决方案3】:

    我使用this 教程为我的TextView 实现了捏缩放。结果代码是这样的:

    private GestureDetector gestureDetector;
    private View.OnTouchListener gestureListener;
    

    在 onCreate() 中:

        // Zoom handlers
        gestureDetector = new GestureDetector(new MyGestureDetector());
        gestureListener = new View.OnTouchListener() {
    
            // We can be in one of these 2 states
            static final int NONE = 0;
            static final int ZOOM = 1;
            int mode = NONE;
    
            static final int MIN_FONT_SIZE = 10;
            static final int MAX_FONT_SIZE = 50;
    
            float oldDist = 1f;
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                TextView textView = (TextView) findViewById(R.id.text);
    
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_POINTER_DOWN:
                        oldDist = spacing(event);
                        Log.d(TAG, "oldDist=" + oldDist);
                        if (oldDist > 10f) {
                           mode = ZOOM;
                           Log.d(TAG, "mode=ZOOM" );
                        }
                        break;
                    case MotionEvent.ACTION_POINTER_UP:
                        mode = NONE;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (mode == ZOOM) {
                            float newDist = spacing(event);
                            // If you want to tweak font scaling, this is the place to go.
                            if (newDist > 10f) {
                                float scale = newDist / oldDist;
    
                                if (scale > 1) {
                                    scale = 1.1f;
                                } else if (scale < 1) {
                                    scale = 0.95f;
                                }
    
                                float currentSize = textView.getTextSize() * scale;
                                if ((currentSize < MAX_FONT_SIZE && currentSize > MIN_FONT_SIZE)
                                        ||(currentSize >= MAX_FONT_SIZE && scale < 1)
                                        || (currentSize <= MIN_FONT_SIZE && scale > 1)) {
                                    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, currentSize);
                                }
                            }
                        }
                        break;
                    }
                return false;
            }
    

    魔术常数 1.1 和 0.95 是根据经验选择的(为此目的使用 scale 变量使我的 TextView 表现得有点奇怪)。

    【讨论】:

    • 我可以知道你的MyGestureDetector()
    • @Renanlf 那是一年多以前的事了。抱歉,我什至不再为 android 编写代码了。我在任何地方也没有这些资源。
    • MyGestureDetector() 在这里不相关;由于声明GestureDetector(GestureDetector.OnGestureListener listener),我们得出结论,它是GestureDetector.OnGestureListener 的误称孩子。并且该类检测到的事件与捏缩放无关。
    • switch (event.getAction() & MotionEvent.ACTION_MASK),在这行代码中:ACTION_MASK 变为 255 (ff) 那么添加 Motion.ACTION_MASK 有什么意义呢? switch (event.getAction()) 是否足够,如果不是,为什么?你能解释一下吗?
    • @folone 你能帮我解决this 的问题吗?这个问题与我面临的类似
    【解决方案4】:

    还有这个项目可以完成这项工作并为我完美地工作: https://github.com/chrisbanes/PhotoView

    【讨论】:

      【解决方案5】:

      在蜂窝,API 级别 11 中,这是可能的,我们可以使用带有枢轴点的 setScalaX 和 setScaleY
      我这里已经解释过了
      Zooming a view completely
      Pinch Zoom to view completely

      【讨论】:

        【解决方案6】:

        我创建了一个支持 Android 2.1+ 的基本捏合缩放项目

        有空here

        【讨论】:

          【解决方案7】:

          我有一个非常好的开源库。这是一个四手势库,带有开箱即用的平移缩放设置。你可以在这里找到它:https://bitbucket.org/warwick/hacergestov3 或者您可以在这里下载演示应用程序:https://play.google.com/store/apps/details?id=com.WarwickWestonWright.HacerGestoV3Demo 这是一个纯画布库,因此几乎可以在任何场景中使用。 希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-03
            • 1970-01-01
            • 2020-10-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-15
            • 2015-07-12
            相关资源
            最近更新 更多