【问题标题】:Is there a built in API for handling pinch-zoom functionality in Android是否有用于处理 Android 中的捏缩放功能的内置 API
【发布时间】:2011-02-08 09:26:53
【问题描述】:

我只是想知道是否有某种类可以使用 android 2.1 的多点触控功能。具体来说,我正在尝试实现双指缩放,并且想知道我是否总是必须测量两个触摸事件之间的距离并自己计算缩放级别?

谢谢, 克里斯

【问题讨论】:

  • 我自己刚刚开始研究 android dev 的东西,如果没有,这将是一个很好的机会来开始一个并将其提供给其他人。
  • 您似乎混淆了“多点触控”一词。您具体要求的是“捏缩放”功能。这是使用多点触控可以完成的事情之一。多点触控功能就是在屏幕上同时检测两个或多个触摸事件的能力。

标签: android multi-touch


【解决方案1】:

开发人员创建了一些可以在浏览器和 Dolphin 浏览器上启用多点触控的 hack。这些来自自定义 rom,我确信它们是可下载的。

Google 还正式在 Nexus One 和摩托罗拉的里程碑上发布了多点触控功能。这意味着您应该能够为它获得一个官方课程,但我敢打赌它适用于 Android 2.1 版。

另外,我认为可以安全地假设您希望它在有根手机上运行。这意味着您可能会被困在使用 Android 2.1 甚至可能一直使用 Android 2.0。

【讨论】:

  • 问题是关于Android开发的。这个网站是关于软件开发的。您的答案是针对最终用户的。
  • @CommonsWare:这与软件开发有关。如果 API 不是针对 Android 2.0 的,而是针对 Android 2.1 的,那确实会影响他的开发结果。
【解决方案2】:

我相信您需要自己计算缩放级别。这篇文章看起来是一个很好的入门资源:http://blogs.zdnet.com/Burnette/?p=1847

【讨论】:

  • 我认为 Ed Burnette(该帖子的作者)在他即将出版的第三版《Hello, Android》中进行了更详细的介绍。
【解决方案3】:

我正在尝试做同样的事情,并且像往常一样,我的第一直觉是查看 Android 源代码本身。有趣的部分似乎在 ScaleGestureDetector 类中,它不是公开的,但它的 javadoc 说

@hide 等待 API 批准

所以希望它会在某个时候公开。

更新ScaleGestureDetector 现在是 Android 2.2 API 的一部分。

【讨论】:

    【解决方案4】:

    您要放大图片吗?作为一个简单的解决方案,您可以使用 WebView 来显示您的图像,它具有内置的双指缩放功能。

    【讨论】:

      【解决方案5】:

      这取决于您希望定位的 Android 版本。

      • 2.2 或更高版本 - 使用内置的 ScaleGestureDetector。 javadoc 非常有用,但请参阅下面的示例。
      • 2.0-2.2 - ScaleGestureDetector 不是内置的,所以copy the version from Android 并将其编译到您的应用程序中。
      • 2.0 之前 - 2.0 之前不支持多点触控,因此您需要copy ScaleGestureDetector.java from Android 并做更多工作以不在不受支持的设备上使用任何多点触控 API:

      为了避免在 2.0 之前的设备上使用多点触控 API,您需要为 ScaleGestureDetector 创建一个接口(Eclipse 可以通过 Refactor 菜单执行此操作),以及一个 1.x 设备将使用的虚拟实现。我们将调用我们的接口ScaleGestureDetectorInterface 和我们的虚拟实现FakeScaleGestureDetector

      这是一个支持 2.0 之前的设备的示例:

      // If you don't care about pre-2.0 devices, just make this a
      // ScaleGestureDetector and skip the API check in the constructor.
      private final ScaleGestureDetectorInterface mScaleDetector;
      
      public MyView {
          if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) {
              // Use the fake version which won't call any multitouch APIs
              mScaleDetector = new FakeScaleGestureDetector();
          } else {
              // We are using SDK 2.0+, use the real implementation.
              mScaleDetector = new ScaleGestureDetector(context,
                  new MyScaleListener());
          }
      }
      
      @Override
      public boolean onTouchEvent(MotionEvent event) {
          // On pre-2.0, the implementation does nothing.
          return mScaleDetector.onTouchEvent(event);
      }
      
      private class MyScaleListener extends
              ScaleGestureDetector.SimpleOnScaleGestureListener {
          @Override
          public boolean onScale(ScaleGestureInterface detector) {
              float scaleFactor = detector.getScaleFactor();
              // If you were using a matrix to zoom an ImageView, you would do
              // something like this:
              mMatrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(),
                  detector.getFocusY());
              return true;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        相关资源
        最近更新 更多