public class CustomDrawerLayout extends DrawerLayout
{
private View rightView;
private int mTouchSlop;
public CustomDrawerLayout (Context context)
{
this(context, null);
}
public CustomDrawerLayout (Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public CustomDrawerLayout (Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(ViewConfiguration.get(context));
}
public void setRightView (View v)
{
this.rightView = v;
}
@Override
public boolean onInterceptTouchEvent (MotionEvent ev)
{
boolean result = super.onInterceptTouchEvent(ev);
if (rightView != null && isDrawerOpen(rightView))
{
DrawerLayout.LayoutParams layoutParams = (DrawerLayout.LayoutParams) rightView.getLayoutParams();
if (layoutParams.gravity == Gravity.END)
{
// This is true when the position.x of the event is happening on the left of the drawer (with gravity END)
if (ev.getX() < rightView.getX() && ev.getX() > mTouchSlop)
{
result = false;
}
}
}
return result;
}
}
3条答案
按热度按时间mec1mxoz1#
您需要执行以下操作:
1.通过设置透明颜色禁用布局淡入淡出:
1.锁定抽屉
1.创建一个自定义抽屉类,允许在锁定模式下单击:
1.在xml中使用此类:
hk8txs482#
这是一个棘手的问题。当抽屉打开时,它会拦截触发抽屉关闭的触摸事件。为了防止这种情况发生,您需要将DrawerLayout子类化并覆盖onInterceptTouchEvent方法:
这是我在右边抽屉上的代码。我相信你可以把它应用到左边的抽屉上。你可能还想禁用阴影:
ycl3bljg3#
感谢@Simas的解决方案!
我发现如果用户点击的项目离drawerView很近,使用
ev.rawX
是不合适的。此外,我添加了其他重力检查来确定拦截。