与ScrollView一起改变?
我可以在这个特定的问题上找到最好的(虽然我不使用图库):ScrollView和Gallery干扰 - 虽然没有给出具体的答案。 显然,我的实现并不使用Gallery。
跳到下一个有趣部分的大胆部分
所以我得到了Fling / Swipe / Flick /不管你想在我的应用程序上工作一段时间。 灵感来自几个不同的地方,其中一些是Stack Overflow(网格布局上的Fling手势检测),Code Shogun(http://www.codeshogun.com/blog/2009/04)中的“基本手势检测” / 16 / how-to-implement-swipe-action-in-android /)和开发Android(http://developingandroid.blogspot.com/2009/09/implementing-swipe-gesture.html),但我不使用一个ViewFlipper在我的应用程序中。 当发生投掷时,我只需更改选项卡(在末端环绕)。
现在,我的一些标签包含ScrollViews。 这些ScrollViews显然会响应上/下卷轴,以便让您查看其中的所有数据,这并不令人意外。 问题在于它会出现这些ScrollView的“滚动”功能,会覆盖我的投掷手势。 我不能在ScrollView中滚动(滚动得很好),但它在他们之外完美地工作(在同一个选项卡上,在其他视图上,如TableRow或其他)。
我也快速浏览了http://blog.velir.com/index.php/2010/11/17/android-snapping-horizontal-scroll/,它提供了一种实现HorizontalScrollView的方法。 但它仍然通过扩展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状态的文档:
“当触摸屏事件不是由它下面的任何视图处理时调用,这对于处理发生在窗口范围之外的触摸事件非常有用,在这些事件中,没有视图可以接收它。”
所以ScrollView会“覆盖”它 - 我该怎么做? 有没有办法确保两者都被检查? 我的onTouchEvent在通过ScrollView处理onTouchEvent时未被命中:
@Override
/** Used for swipe gestures */
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event))
return true;
else
return false;
}
下面更通用的源代码,它可能不是非常重要。 我的Tabs类中的gestureDetector及其关联的侦听器:
// 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) - 它与您在此主题上找到的任何其他代码相同:
/** 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应用源代码,因为他们的FlingableTabHost
实现似乎解决了这个问题:
http://iosched.googlecode.com/svn/trunk/src/com/google/android/apps/iosched/ui/ScheduleActivity.java
我认为关键是在扩大TabHost
并覆盖其onInterceptTouchEvent
方法。
在寻求解决我遇到的类似问题时,我遇到了这样一个问题:
eventsInterceptionEnabled:当设置为true时,该属性告知叠加层一旦知道用户真的正在绘制手势,就会从其子项中窃取事件。 这在覆盖层下有可滚动视图时非常有用,可避免在用户绘制手势时滚动基础子项
在Android Dev站点上,它讨论了在布局文件的<android.gesture.GestureOverlayView>
Root中使用此属性。
对于它的价值,我发现onFling方法非常不可靠。 我重写SimpleGestureDetector中的onScroll方法,并将我的onInterceptTouchEvent定义为:
@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;
}
链接地址: http://www.djcxy.com/p/16205.html