【发布时间】:2017-11-04 12:39:47
【问题描述】:
我有一个 View Pager (VP),其中包含一个水平滚动视图 (HSV)。如果 HSV 到达它的一个边缘或根本无法滚动,则在阻塞方向上的新滑动时,VP 应接管滚动到下一页。我犹豫要不要问这个问题,因为我发现了类似的问题:
Can I use Horizontal Scrollview Inside a Viewpager in Android?
或
horizontalscrollview inside viewpager
但该解决方案对我不起作用。 'v instanceof HorizontalScrollView' 为真,但 viewPager 不滚动
任何其他想法如何实现所需的行为?
public class MyViewPager extends ViewPager {
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// Update 1
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
//return super.onInterceptTouchEvent(ev);
}
/**
* https://stackoverflow.com/questions/22781496/can-i-use-horizontal-scrollview-inside-a-viewpager-in-android
*/
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if (v instanceof HorizontalScrollView) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
}
子视图:view_pager_page.xml:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<include layout="@layout/" />
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
</FrameLayout>
</RelativeLayout>
父视图:view_pager.xml
<android.support.design.widget.CoordinatorLayout>
...
<LinearLayout>
<packagepath.MyViewPager
android:layout_width="match_parent"
android:layout_height="wrap_content">
</packagepath.MyViewPager>
</LinearLayout>
...
<android.support.design.widget.CoordinatorLayout>
更新 1:当覆盖 'onInterceptTouchEvent' 并让它始终返回真正的 VP 滚动时,但 HSV 不会。我认为只有当 HSV 到达边缘时这才必须返回 true 对吗?如果是这种情况,我该如何判断?
更新2:我重构了android的触摸事件机制,希望对如何拦截运动事件流有所了解。例如。在 HSV 中,我可以简单地返回 false 让 VP 使用这个和所有后续的运动事件。不幸的是,我需要两个 MotionEvent.MOVE 类型的运动事件来决定 HSV 或 VP 在到达边缘时是否应该滚动(如果 HSV 已到达右边缘,则向右滑动将 HSV 向后滚动,向左滑动滚动到 VP 的下一页)。但是,如果我跳过 MotionEvent.DOWN 动作,HSV 或 VP 都不会开始滚动……很难解决。有什么想法吗?
Touchevent Mechanism in Android
(警告:图不完整,会有错误,请大家指正:-))
更新 3:我终于让它工作了。了解 Touchevent 机制有很大帮助,也是 ZeroOne 的第一条评论。我会在有时间的时候发布我的解决方案。
【问题讨论】:
-
你需要使用 onInterceptTouchEvent 拦截视图
-
我需要在哪里拦截TouchEvent?在 ViewPager 或 HorizontalScrollView 中?你有例子吗?
标签: android user-interface android-viewpager horizontalscrollview