Android中是否有用于处理Pinch缩放功能的内置API?

10

我想知道是否有一种类可以使用Android 2.1的多点触控功能。特别是我正在尝试实现捏合缩放,想知道是否必须始终测量两个触摸事件之间的距离并自己计算缩放级别?

谢谢, 克里斯


1
我自己也刚开始学习Android开发,如果还没有这样的资源,那么这将是一个很好的机会去创建并与他人分享。 - onaclov2000
你似乎把“多点触控”这个术语和“捏合缩放”功能混淆了。你具体要求的是“捏合缩放”功能,而这正是可以通过多点触控来实现的一种功能之一。多点触控功能就是简单地能够同时检测到屏幕上两个或更多的触摸事件。 - Mark B
5个回答

15

我正试图做同样的事情,通常我的第一反应是查看Android源代码。有趣的部分似乎在类ScaleGestureDetector中,该类不是公共的,但其javadoc说:

@hide Pending API approval

因此希望它最终会变为公共的。

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


4

1
我认为Ed Burnette(该帖子的作者)在他的著作《Hello,Android》第三版中会更详细地介绍。 - CommonsWare

3

这取决于您想要针对哪个版本的Android进行开发。

  • 2.2或更高版本 - 使用内置的ScaleGestureDetector。Javadoc非常有帮助,但请参见下面的示例。
  • 2.0-2.2 - 没有内置ScaleGestureDetector,因此需要从Android复制该版本并将其编译到您的应用程序中。
  • 2.0之前 - 在2.0之前不支持多点触控,因此您需要从Android复制ScaleGestureDetector.java并进行一些额外的工作,以在不支持的设备上不使用任何多点触控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;
    }
}

1

开发人员已经创建了一些黑客程序,可以在浏览器和海豚浏览器上启用多点触控。这些程序包含在自定义ROM中,我相信它们是可下载的。

此外,Google已经在Nexus One上正式发布了多点触控功能,Motorola也在他们的Milestone上发布了该功能。这意味着您应该能够获得官方的类库,但我敢打赌它只适用于Android 2.1版本。

另外,我认为可以安全地假设您希望此功能在已Root的手机上运行。这意味着您可能会被困在使用Android 2.1甚至2.0的版本上。


这个问题是关于Android开发的。这个网站是关于软件开发的。你的回答是给最终用户的。 - CommonsWare
@CommonsWare:这与软件开发密切相关。如果API在Android 2.0中不存在但在Android 2.1中存在,则会影响他的开发结果。 - Andrew Moore

0
你想对图片进行缩放吗?作为一个简单的解决方案,你可以使用 WebView 来显示你的图片,它具有内置的捏合缩放功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接