Swipe/Fling tab-changing in conjunction with ScrollView?
我在这个特定问题上找到的最好的(尽管我不使用图库):ScrollView和Gallery干扰 - 虽然没有给出具体的答案。显然,我的实现不使用Gallery。
跳转到有趣部分的下一个大胆部分
因此,我的Fling / Swipe / Flick /无论您想要在我的应用程序上将其称为工作片段。灵感来自几个不同的地方,其中一些是Stack Overflow上的"基本手势检测"(网格布局上的手势检测),Code Shogun(http://www.codeshogun.com/blog/2009/04 / 16 /如何实现-swipe-action-in-android /)和开发Android(http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html),但我不使用我的应用程序中的ViewFlipper。当发生甩尾时,我只需更换标签(在末端缠绕)。
现在,我的一些标签包含ScrollViews。这些ScrollViews显然会响应向上/向下滚动,以便让您查看其中的所有数据,这并不奇怪。
问题是看起来这些ScrollViews的"滚动"功能会覆盖我的手势。我不能在ScrollView内部滚动(滚动得很好),但它在它们之外完美无缺(在同一个选项卡上,在TableRow等其他视图上)。
我快速浏览了http://blog.velir.com/index.php/2010/11/17/android-snapping-horizo??ntal-scroll/,它提供了一种实现Horizo??ntalScrollView的方法。但它仍然通过扩展SimpleOnGestureListener(并覆盖onFling)的类来处理手势,这与我的实现相同(这使我相信它不会真正有用)。
来自Google的ScrollView的源代码:http://google.com/codesearch/p?hl = zh_CN&ux1GffpyOZk / core / java / android / widget / ScrollView.java& d = 3
有没有办法让我的Swipe和ScrollView的实现毫不费力地协同工作?
我想这就是问题所在。 ScrollView.java还使用一个名为onTouchEvent的方法和onTouchEvent for Activity状态的文档:
"Called when a touch screen event was
not handled by any of the views under
it. This is most useful to process
touch events that happen outside of
your window bounds, where there is no
view to receive it."
所以ScrollView会"覆盖"它 - 我该怎么办?有没有办法确保两者都被检查?我的onTouchEvent在ScrollView处理onTouchEvent时没有被击中:
1 2 3 4 5 6 7 8 | @Override /** Used for swipe gestures */ public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return true; else return false; } |
下面是更一般的源代码,它可能不是很重要。我的Tabs类中的gestureDetector及其关联的侦听器:
1 2 3 4 5 6 7 8 9 10 11 | // Gestures gestureDetector = new GestureDetector(new MyGestureDetector()); gestureListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } return false; } }; |
我的手势类是我的Tabs类的嵌套类(它扩展了TabActivity) - 它与你在这个主题上找到的任何其他代码相同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** GestureDetector used to swipe between classes */ class MyGestureDetector extends SimpleOnGestureListener { TabHost tabHost = getTabHost(); @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // my tab code return true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { // my tab code return true; } } catch (Exception e) { Log.e("MyGestureDetector onFling", e.toString()); } return false; } } |
我建议您查看Google I / O 2010应用程序源代码,因为他们的
http://iosched.googlecode.com/svn/trunk/src/com/google/android/apps/iosched/ui/ScheduleActivity.java
我认为关键在于扩展
对于它的价值,我发现onFling方法非常不可靠。 我重写了SimpleGestureDetector中的onScroll方法,并将onInterceptTouchEvent定义为:
1 2 3 4 5 6 7 | @Override public boolean onInterceptTouchEvent(MotionEvent ev) { //Call super first because it does some hidden motion event handling boolean result = super.onInterceptTouchEvent(ev); if (this.mGestureScanner.onTouchEvent(ev)) return true; return result; } |
在寻找解决我遇到的类似问题时,我遇到了这个问题:
eventsInterceptionEnabled: when set to true, this property tells the overlay to steal the events from its children as soon as it knows the user is really drawing a gesture. This is useful when there's a scrollable view under the overlay, to avoid scrolling the underlying child as the user draws his gesture
在Android Dev网站上,它讨论了在布局文件中的