如何解决DrawerLayout与Viewpager的滑动冲突
2015-12-30 15:48
405 查看
问题:在viewpager的第一页加入DrawerLayout的时候则会产生左右滑动的冲突
解决思路:
1、当Viewpager滑动到第一页的时候,将Viewpager的右滑禁止掉,这种可以保证DrawerLayout顺利的滑出
2、当DrawerLayout滑出的时候,监听DrawerLayout的滑动事件,滑出完全禁止掉ViewPager的滑动,
当DrawerLayout关闭的时候充值启动ViewPager的滑动
(ps:我也尝试改变事件分发,但还是会有小bug,会的大神可以留言指教下。。。)
代码:
第一步:自定义ViewPager,禁止掉第一页的右滑,同时实现了Viewpager是否允许滑动,调用setNoScroll()即可
第二步:监听DrawerLayout的滑动,滑出禁止ViewPager的滑动,滑动重新恢复ViewPager的滑动
解决思路:
1、当Viewpager滑动到第一页的时候,将Viewpager的右滑禁止掉,这种可以保证DrawerLayout顺利的滑出
2、当DrawerLayout滑出的时候,监听DrawerLayout的滑动事件,滑出完全禁止掉ViewPager的滑动,
当DrawerLayout关闭的时候充值启动ViewPager的滑动
(ps:我也尝试改变事件分发,但还是会有小bug,会的大神可以留言指教下。。。)
代码:
第一步:自定义ViewPager,禁止掉第一页的右滑,同时实现了Viewpager是否允许滑动,调用setNoScroll()即可
import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; /** * 解决ViewPager与DrawerLayout的冲突问题 * 思路:把第一个Fragment的ViewPager的右滑给禁掉 * Created by liuyi on 2015/11/13. */ public class MyViewPager extends ViewPager { private float xDistance, xLast; private boolean noScroll = false; public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } /** * 禁止第一个frament右滑 * * @param ev * @return */ @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (noScroll) { return false; } switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = 0f; xLast = ev.getX(); break; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); //第一个Fragment禁止右滑 if (xLast - curX < 0 && getCurrentItem() == 0) { return false; } //最后一个Fragment禁止左滑 // if (xLast - curX > 0 && getCurrentItem() == 1) { // return false; // } break; } return super.onInterceptTouchEvent(ev); } @Override public void scrollTo(int x, int y) { super.scrollTo(x, y); } /** * 控制Viewpager是否可滑动 * * @param noScroll : true 不能滑动 */ public void setNoScroll(boolean noScroll) { this.noScroll = noScroll; } @Override public boolean onTouchEvent(MotionEvent arg0) { /* return false;//super.onTouchEvent(arg0); */ if (noScroll) return false; else return super.onTouchEvent(arg0); } @Override public void setCurrentItem(int item, boolean smoothScroll) { super.setCurrentItem(item, smoothScroll); } @Override public void setCurrentItem(int item) { super.setCurrentItem(item); } }
第二步:监听DrawerLayout的滑动,滑出禁止ViewPager的滑动,滑动重新恢复ViewPager的滑动
//处理Viewpager与DrawerLayout滑动的冲突问题 mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { } @Override public void onDrawerOpened(View drawerView) { //禁止Viewpager的滑动,从而避免与DrawerLayout的冲突 viewpager.setNoScroll(true); } @Override public void onDrawerClosed(View drawerView) { //解除Viewpager的禁止滑动 viewpager.setNoScroll(false); } @Override public void onDrawerStateChanged(int newState) { } });
相关文章推荐
- track a app or a game
- ZJUT_1175
- CodeForces 424D Biathlon Track【二维dp】
- 阿里巴巴2016校招面试经验
- struts2 StrutsPrepareAndExecuteFilter 源码分析
- 添加场景的进入方式(从左往右,渐进)
- DDD领域驱动设计基本理论知识总结
- Error: [ngModel:constexpr] 的解决办法
- windows下node.js及express的安装
- 实验四 主存空间的分配和回收模拟
- 云南省政府与华为签署战略合作协议 共创云计算产业发展新局面
- c语言_FILE结构体解释及相关操作
- 给linux添加一个回收站
- GeoSever安装及服务发布
- Android Studio 安装配置详细步骤,以及使用的基本操作
- Spring事务管理--高级应用难点剖析: 第 2 部分
- Sublime Text3注册码
- ZJUT_1174
- java中通过文件路径获取文件名
- iOS 给图片加点击事件