我的应用程序使用支持包Fragment
在 2.2 以上实现 s。
我有一个View
子类(我们称之为ZoomableView
),ScaleGestureDetector
用于检测捏缩放事件。这是以熟悉的方式完成的;也就是说,在 内onTouchEvent()
,MotionEvent
s 使用 传递给检测器mScaleDetector.onTouchEvent(event)
。ASimpleOnScaleGestureListener
用于接收缩放事件。
此类ZoomableView
始终显示为 a 中的唯一View
(Fragment
我们称之为它ZoomableFragment
)。在应用程序中有两个用例。在一个用例中,布局仅包含ZoomableFragment
,包含ZoomableView
. 在第二个用例中,ZoomableFragment
将显示在另一个 Fragment 旁边。另一个Fragment
恰好是容纳 a MapView
,但使用MapView
与问题无关(如果第二个Fragment
只包含一个普通的 ,问题仍然存在View
)。
实际问题是,在 Jellybean 之前的设备(特别是 Froyo 手机)上进行测试时,当使用Activity
显示双Fragment
布局的 ' 时,ZoomableFragment
'ZoomableView
ScaleGestureDetector
不起作用。当我说“不起作用”时,我可以在调试器中看到它处理MotionEvent
s,但没有SimpleOnScaleGestureListener
调用 s 中的任何方法。但是,当使用仅Activity
包含的 时,比例检测确实有效。如果我在我的 JellyBean 设备上试用该应用程序,双胞胎情况绝对可以正常工作;即接收到缩放手势。ZoomableFragment
Fragment
我四处搜索,我能找到的唯一问题是人们在哪里实施OnScaleGestureListener
并通过从onScaleBegin()
. 这不是我的问题。
因此,总而言之,当在 Froyo(Android 2.2)上的多支持布局上ScaleGestureDetector
使用时,a 不会调用它的侦听器,我假设包括 ICS。但是,如果这是屏幕上唯一的一个,则检测器工作正常。此外,在我的 4.1+ Jellybean 设备上不存在任何问题。View
Fragment
Fragment
编辑 1在我的双片段布局中,ZoomableFragment
始终根据方向放置在右侧或底部。我刚刚做出的一个有趣的观察是,如果我翻转布局,使其ZoomableFragment
在纵向的顶部(而不是下部的片段),或者在水平方向的左侧,那么比例检测器就可以工作了!因此,我怀疑这与使用 Fragments 时MotionEvent
getRawX()
/ getX()
(和 Y 类似)方法的结果之间的关系有关。但是当我像这样翻转布局时,捏缩放不适用于相邻MapView
Fragment
!因此,总而言之,在 Froyo 上,它似乎ScaleGestureDetector
只适用于在屏幕 0,0 处具有角的 a 中View
包含的 a 。Fragment
编辑 2ScaleGestureDetector
在检查grepcode的源代码后,我现在自己用一个简单的解决方案回答了这个问题。因为即使 ICS 使用了getRawX()
/的来源getRawY()
,我已经更新了这个问题以说明 ICS 受到影响(我相信),而不仅仅是我最初想到的 Froyo。
编辑 3我做了一个简单的测试,以完全消除与Fragment
s 或我的应用程序中的任何其他内容有关的任何内容。我采用了简单的 GoogleMapView
示例项目并简单地更改了布局,以便屏幕的大部分被一个(重量 0.9)占据,而底部的TextView
一个微小的重量仅为 0.1。MapView
在我的 Froyo 设备上,它不会再捏缩放。在我的 JB 设备上,确实如此。所以看来我不会发疯,我在 ICS 及以下(我认为 - 当然是 Froyo,无论如何)上遇到了问题,GestureScaleDetector
答案给出了解决方案。