2010-04-15 62 views
10

我只是想知道是否有某种类使用android 2.1的多点触摸功能。具体来说,我试图实现捏缩放,并想知道我是否总是必须测量两个触摸事件之间的距离并自行计算缩放级别?是否有内置的API用于处理Android中的捏缩放功能

感谢, 克里斯

+1

我刚刚开始了自己的android开发东西,如果没有一个,这将是一个很好的机会,启动一个,并提供给其他人。 – onaclov2000 2010-04-15 13:30:32

+0

你似乎混淆了术语“多点触控”。你特别要求的是“捏变焦”功能。这是使用多点触控可以完成的事情之一。多点触控功能就是在屏幕上同时检测两个或多个触摸事件的功能。 – 2010-04-15 14:02:38

回答

1

已经有开发人员,使浏览器和海豚浏览器的多点触控创建的黑客。这些来自自定义ROM,我相信他们是可下载的。

此外,Google已经在其Nexus One和Motorola的里程碑上正式发布了多点触控。这意味着你应该能够获得一个正式的课程,但我敢打赌,它的Android版本2.1。

此外,我认为这是可以安全地假设你想这根植于手机。这意味着你可能会被困在使用Android 2.1并可能一路下降到2.0。

+0

问题是关于Android的开发。这个网站是关于软件开发的。您的答案是针对最终用户的。 – CommonsWare 2010-04-15 14:03:46

+0

@CommonsWare:这非常关于软件开发。如果API不适用于Android 2.0,但适用于Android 2.1,则确实会影响其开发的结果。 – 2010-04-15 18:49:43

4

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

+1

我认为Ed Burnette(那篇文章的作者)在他的即将出版的第三版“Hello,Android”中详细介绍了它。 – CommonsWare 2010-04-15 14:06:19

15

我想做同样的事情,和往常一样,我的第一个直觉是看看Android的源代码本身。有趣的片段似乎是在ScaleGestureDetector类,这是不公开的,但它的javadoc说

@hide待审批API

所以希望它会在某个时候成为公众。

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

0

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

3

这取决于您想要定位的Android版本。

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

要避免使用前多点触控的API 2.0设备,您需要为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; 
    } 
}