android 解决SlidingMenu 侧滑与ViewPager冲突问题
2016-07-13 10:59
525 查看
由于使用了Github上的开源项目,开始以为需要自己在CustomViewAbove中改写OnInterceptTouchEvent(MotionEvent ev);
参看了一下百度视频App,发现它在首页里的ViewPager控件在下拉后,只有上面部分可以响应左右滑动事件,下面的部分却不可以,于是我猜想它把上面部分写死了,先调用view.getHitRect(rect)来获得viewpager的矩形框位置,然后,判断触摸的点是否在矩形框内。
本以为要自己写的。后来在查看CustomViewAbove的OnInterceptTouchEvent(MotionEvent ev)方法时,看到有个方法thisTouchAllowed(ev);
于是展开去看
居然后有个方法,isInIgnoreView(),如果不在忽略的View中,就会返回true传给CustomViewAbove自己的onTouchEvent()来消费该事件,于是猜想是不是有个方法可以可以把slidingMenu把想忽视侧滑这一触摸事件的View加入判断中,
原来mIgnoredViews是一个ArrayList<View>,而且还有一个这样的方法。
SlidingMenu类中又调用了CustomViewAbove的addIgnoreView()
于是找到解决办法了,如果是MainActivity继承SlidingFragmentActivity的这种情况,可以做如下处理:
在自己定义的Fragment中:
大功告成!
参看了一下百度视频App,发现它在首页里的ViewPager控件在下拉后,只有上面部分可以响应左右滑动事件,下面的部分却不可以,于是我猜想它把上面部分写死了,先调用view.getHitRect(rect)来获得viewpager的矩形框位置,然后,判断触摸的点是否在矩形框内。
<span style="margin: 0px; padding: 0px; border: 0px; background: transparent;"> </span>Rect rect = new Rect(); viewPager.getHitRect(rect); if(rect.contains(event.getX(), event.getY()) return false;
本以为要自己写的。后来在查看CustomViewAbove的OnInterceptTouchEvent(MotionEvent ev)方法时,看到有个方法thisTouchAllowed(ev);
case MotionEvent.ACTION_DOWN: mActivePointerId = ev.getAction() & ((Build.VERSION.SDK_INT >= 8) ? MotionEvent.ACTION_POINTER_INDEX_MASK : MotionEvent.ACTION_POINTER_INDEX_MASK); mLastMotionX = mInitialMotionX = MotionEventCompat.getX(ev, mActivePointerId); mLastMotionY = MotionEventCompat.getY(ev, mActivePointerId); if (<span style="margin: 0px; padding: 0px; border: 0px; color: rgb(255, 0, 0); background: transparent;">thisTouchAllowed(ev)</span>) { mIsBeingDragged = false; mIsUnableToDrag = false; if (isMenuOpen() && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX)) { mQuickReturn = true; } } else { mIsUnableToDrag = true; } break;
于是展开去看
private boolean thisTouchAllowed(MotionEvent ev) { int x = (int) (ev.getX() + mScrollX); if (isMenuOpen()) { return mViewBehind.menuOpenTouchAllowed(mContent, mCurItem, x); } else { switch (mTouchMode) { case SlidingMenu.TOUCHMODE_FULLSCREEN: return <span style="margin: 0px; padding: 0px; border: 0px; color: rgb(255, 0, 0); background: transparent;">!isInIgnoredView(ev)</span>; case SlidingMenu.TOUCHMODE_NONE: return false; case SlidingMenu.TOUCHMODE_MARGIN: return mViewBehind.marginTouchAllowed(mContent, x); } } return false; }
居然后有个方法,isInIgnoreView(),如果不在忽略的View中,就会返回true传给CustomViewAbove自己的onTouchEvent()来消费该事件,于是猜想是不是有个方法可以可以把slidingMenu把想忽视侧滑这一触摸事件的View加入判断中,
private boolean isInIgnoredView(MotionEvent ev) { Rect rect = new Rect(); for (View v : mIgnoredViews) { v.getHitRect(rect); if (rect.contains((int) ev.getX(), (int) ev.getY())) return true; } return false; }
原来mIgnoredViews是一个ArrayList<View>,而且还有一个这样的方法。
public void addIgnoredView(View v) { if (!mIgnoredViews.contains(v)) { mIgnoredViews.add(v); } }
SlidingMenu类中又调用了CustomViewAbove的addIgnoreView()
/** * Add a View ignored by the Touch Down event when mode is Fullscreen * * @param v * a view to be ignored */ public void addIgnoredView(View v) { mViewAbove.addIgnoredView(v); }
于是找到解决办法了,如果是MainActivity继承SlidingFragmentActivity的这种情况,可以做如下处理:
public static SlidingMenu mSlidingMenu = getSlidingMenu();
在自己定义的Fragment中:
ActMain.mSlidingMenu.addIgnoredView(viewPager); <span style="margin: 0px; padding: 0px; border: 0px; font-family: Arial, Helvetica, sans-serif; background: transparent;"> </span>
大功告成!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories