今天写代码发现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);