- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的应用程序利用支持包来实现 Fragment
s 2.2 向上。
我有一个 View
使用 ZoomableView
的子类(我们称之为 ScaleGestureDetector
)检测捏缩放事件。这是以熟悉的方式完成的;即在onTouchEvent()
内, MotionEvent
s 使用 mScaleDetector.onTouchEvent(event)
传递给检测器.一个 SimpleOnScaleGestureListener
用于接收缩放事件。
此 ZoomableView
class 始终显示为唯一 View
内Fragment
(我们称之为 ZoomableFragment
)。应用程序中有两个用例。在一个用例中,布局仅包含 ZoomableFragment
,包含 ZoomableView
.在第二个用例中,ZoomableFragment
将与另一个 Fragment 一起显示。这个其他 Fragment
碰巧住着一个MapView
,但使用 MapView
与问题无关(如果第二个 Fragment
只包含一个普通的 View
,问题仍然存在)。
实际的问题是,在 Jellybean 之前的设备(特别是 Froyo 手机)上进行测试时,使用 Activity
时显示双胞胎- Fragment
布局,ZoomableFragment
的 ZoomableView
ScaleGestureDetector
不起作用。当我说“不起作用”时,我可以在调试器中看到它处理 MotionEvent
s,但没有 SimpleOnScaleGestureListener
中的任何方法被称为。但是,当使用 Activity
时仅包含 ZoomableFragment
,尺度检测确实有效。如果我在 JellyBean 设备上试用该应用程序,双胞胎- Fragment
情况绝对正常;即接收缩放手势。
我四处搜索,唯一能找到的问题是人们在哪里实现了 OnScaleGestureListener
并通过从 onScaleBegin()
返回 false 来阻止它工作.这不是我的问题。
综上所述,ScaleGestureDetector
在 View
中使用时,它应该做的时候不调用它的监听器在多重支持 Fragment
Froyo (Android 2.2) 上的布局,我假设包括 ICS。然而如果Fragment
是屏幕上唯一的一个,探测器工作正常。此外,在我的 4.1+ Jellybean 设备上不存在任何问题。
编辑 1 在我的双 fragment 布局中,ZoomableFragment
始终根据方向放置在右侧或底部。我刚刚做的一个有趣的观察是,如果我翻转布局使得 ZoomableFragment
在纵向方向位于顶部(而不是下部 fragment ),或者在水平方向位于左侧,则比例检测器工作!因此,我怀疑这与 MotionEvent
的结果之间的关系有关。 getRawX()
/getX()
(和 Y 类似)方法,当使用 fragment 时。但是当我像这样翻转布局时,捏缩放不适用于相邻的 MapView
Fragment
!因此,总而言之,在 Froyo 上似乎 ScaleGestureDetector
仅适用于 View
包含在 Fragment
中在屏幕的 0,0 处有一个角。
编辑 2 在检查 ScaleGestureDetector
的来源后,我已经用一个简单的解决方案自己回答了这个问题。在 grepcode 上。因为来源甚至就 ICS 使用了 getRawX()
/getRawY()
,我已经更新了这个问题,以说明 ICS 受到影响(我相信),而不仅仅是我最初想到的 Froyo。
编辑 3 我做了一个简单的测试,以完全消除与 Fragment
相关的任何事情。 s 或我的应用程序中的任何其他内容。我拿了简单的谷歌MapView
示例项目并简单地更改了布局,以便大部分屏幕被 TextView
占据。 (重量 0.9)和一个很小的 MapView
位于底部,重量仅为 0.1。在我的 Froyo 设备上,它不会再捏缩放。在我的 JB 设备上,确实如此。所以看起来我并没有发疯,而且我遇到了 GestureScaleDetector
的问题。在 ICS 及以下(我认为 - 当然是 Froyo,无论如何),答案给出了解决方案。
最佳答案
从检查 ScaleGestureDetector
grepcode 上的源代码,我看到 ScaleGestureDetector
的 Jellybean 版本不要使用 getRawX()
和 getRawY()
MotionEvent
的方法.但是,早期版本(Froyo、ICS 等)确实使用了 getRawX()
和 getRawY()
用于斜率计算。这就是问题所在,因为这意味着如果目标 View
,比例检测器将无法工作。左上角没有接近 0,0。
我收到了 ScaleGestureDetector
处理我的自定义 ZoomView
,即使将其放置在右侧或底部,只需在 onTouchEvent()
内执行此操作即可:
event.setLocation(event.getRawX(), event.getRawY());
mScaleDetector.onTouchEvent(event);
MotionEvent
的调整的内部偏移变量,使得
getX/Y
和
getRawX/Y
方法现在返回完全相同的值。这可以防止斜率计算失败。比例检测器当然适用于相对值,因此 X/Y 的绝对值无关紧要。如果您有更多依赖于绝对值的代码,您可以在之后执行我所做的操作来恢复它们:
float originalY = event.getY();
float originalX = event.getX();
event.setLocation(event.getRawX(), event.getRawY());
mScaleDetector.onTouchEvent(event);
event.setLocation(originalX, originalY);
Fragment
包含
MapView
在底部或右侧,我已经在使用
MapView
的自定义子类无论如何,所以我只是添加了这个:
public boolean onTouchEvent(MotionEvent event) {
// Work around required for ScaleGestureDetector.
// Before calling the scale detector, perform a work-around that is needed for earlier APIs (I suspect
// ICS and below, judging from inspection of ScaleGestureDetector) to make the MotionEvent give the
// same values for getY / getRawY and getX / getRawX. Wildly different values, caused by the View
// being nowhere near the screen origin (i.e. the View is on the right or the bottom) means the
// detector doesn't work.
event.setLocation(event.getRawX() - getLeft(), event.getRawY() - getTop());
return super.onTouchEvent(event);
}
MapView
无论在何处
Fragment
都会适本地缩放比例被放置。 (顺便说一句 - 这个问题完全不合时宜,但如果有人想知道,我将
MapView
放入
Fragment
中,成功地使用了 StackOverflow 上给出的
LocalActivityManager
解决方案)。
编辑 :实际上,有些事情并非 100% 正确: map 不会围绕捏合手势的中心进行缩放。我认为这与
getTop()
中未补偿 ActionBar/通知栏高度有关.
关于android - ScaleGestureDetector 不适用于 ICS 及以下的 Fragment 或 ViewGroup 布局中的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13791904/
这个问题在这里已经有了答案: standalone parentheses in javascript [duplicate] (5 个答案) 关闭 8 年前。 我在学习JavaScript,有时会
我是mysql新手,我必须减少以下更新查询的执行时间 UPDATE temp_countcalculations, ( SELECT count(*) as insuffcounts,CRP_
def escape_html(s): for (i, o) in (("&","&"),(">", ">"),(" "变成 ">"等。 关于python - 以下 for 循环
if (read(read(cin, data1), data2)) 问题是C++ Primer 5th Edition 的练习。 read 函数定义如下: std::istream &read(st
我想创建两个宏。其中一个将扩展到函数原型(prototype)和函数内容,另一个将扩展到仅函数原型(prototype)。我正在考虑创建以下内容: #ifdef SOME_CONDITION #def
我正在使用 jongo API - org.jongo.MongoCollection 是类。 我有对象 ID 列表并转换为与 ObjectId[] 相同并尝试按如下方式查询 collection.f
有人可以解释以下正则表达式匹配什么吗? ^.*$ 谢谢! 最佳答案 或者整个字符串或者整行,取决于是否multiline mode被使用。 关于java - 以下 ^.*$ 正则表达式匹配什么?,我们
#include void main() { int a,b,c; for(b = c = 10; a = "- FIGURE?, UMKC,XYZHello Folks,TFy!QJ
我的代码段中的以下代码行被 Sonar 检测为问题。 代码段: final int Pending=1; Sonar 问题: Name 'Pending' must matc
Print name of all activities with neither maximum nor minimum number of participants 我尝试了以下查询,但出现错误:
这个问题在这里已经有了答案: What is this practice called in JavaScript? (7 个回答) 关闭8年前。 (function() { //do stuff
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
这个问题在这里已经有了答案: Export an es6 default class inline with definition or at end of file? (1 个回答) 关闭 2 年
据我了解,以下是相同的: Person p{}; // Case 1 Person p = {}; // Case 1.5 我注意到 Person p = Person{}; // Case 2 产生
below i have given a javascript code picture `` can any one help me in this code. what do this code.
我想在标题和正文上搜索全文,并在答案计数上进行过滤。 我阅读了elasticsearch documentation for combining filters并构建了此查询。 "query": {
它是流动的 C 代码中的内存泄漏吗? #include int *a; int main() { a = malloc(sizeof(int)*10); return
这两个声明有什么区别: char (*ptr)[N]; 对比 char ptr[][N]; 谢谢。 最佳答案 (1)声明 char (*ptr)[N]; ptr 是指向大小为 N 的字符数组的指针 下
data II = I Int Int deriving (Show) instance II Show where show I a b = show (a+b) showt.hs:3:2: s
我从 clojuredoc 中阅读了关于 condp 的文档。在文档中我找到了以下代码: (condp 一些 [1 2 3 4] #{0 6 7} :>> 公司 #{4 5 9} :>> 十二月 #{
我是一名优秀的程序员,十分优秀!