今天写代码发现drawlyaout只能从边缘划出来,并没有在屏幕任意一个位置划动出来的属性,那么就让我们来解决这个问题
我的布局是主布局是个viewpager,侧滑菜单是个NavigationView,我想实现的效果是当viewpager是第一页的时候向右滑动屏幕任意位置侧滑菜单会弹出来,滑动其余位置都不会出来:
1.利用反射机制先设置drawlyaout能够全屏滑动
public static void setDrawerLeftEdgeSize(Activity activity, DrawerLayout drawerLayout, float displayWidthPercentage) { if (activity == null || drawerLayout == null) return; try { Field leftDraggerField = drawerLayout.getClass().getDeclaredField("mLeftDragger"); leftDraggerField.setAccessible(true); ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(drawerLayout); Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize"); edgeSizeField.setAccessible(true); int edgeSize = edgeSizeField.getInt(leftDragger); DisplayMetrics dm = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(dm); edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) (dm.widthPixels * displayWidthPercentage))); } catch (Exception e) { } }
2.重写viewpager的 dispatchTouchEvent()判断滑动条件
@Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: getParent().requestDisallowInterceptTouchEvent(true); startX = ev.getX(); startY = ev.getY(); break; case MotionEvent.ACTION_MOVE: //来到新的坐标 float endX = ev.getX(); float endY = ev.getY(); //计算偏移量 float distanceX = endX - startX; float distanceY = endY - startY; //判断滑动方向 if(Math.abs(distanceX) > Math.abs(distanceY)){ //水平方向滑动 // 当滑动到ViewPager的第0个页面,并且是从左到右滑动 // if(getCurrentItem()==0&&distanceX >0){ getParent().requestDisallowInterceptTouchEvent(false); } // ,当滑动到ViewPager的最后一个页面,并且是从右到左滑动 // else if((getCurrentItem()==(getAdapter().getCount()-1))&& distanceX <0){ getParent().requestDisallowInterceptTouchEvent(true); } // 其他,中间部分 else{ getParent().requestDisallowInterceptTouchEvent(true); } }else{ //竖直方向滑动 getParent().requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_UP: break; default: break; } return super.dispatchTouchEvent(ev); }
3.在MainAcitvity中设置
//设置1.0f表示全屏滑动 final DrawerLayout drawer= (DrawerLayout) findViewById(R.id.drawer); setDrawerLeftEdgeSize(this,drawer,1.0f);
作者:yhy_