DraweLayout基础使用的代码就不贴了,主要解决不能向右滑动打开抽屉视图的问题
找了网上很多,都没有找到合适的,都是一些对DrawerLayout的基本使用,好不容易找到一个SlidingMenu,结果还得配置版本,故此尝试着改一下DrawerLayout代码,由于改动非常简单就不废话了,如您又更好的方法,可以留言给我,不想改源代码。。。。
ps:直接将DrawerLayout和ViewDragHelper拷贝出来就能修改。
效果图:
第一步:好设置抽屉控件宽度,因为它不是全屏的。在Activity或Fragment 视图初始化后就可以设置了,
// 设置抽屉控件宽度,设置简单,就不修改DrawerLayout代码了
mDatabind.linear.setWidth(getWindowWidth(this))
fun View.setWidth(w: Int) {
val params = layoutParams
params.width = w
layoutParams = params
}
fun getWindowWidth(activity:Activity): Int {
val metrics = DisplayMetrics()
activity.windowManager.defaultDisplay.getMetrics(metrics)
return metrics.widthPixels
}
第二步:实现在未打开抽屉试图时,拖拽主视图打开抽屉试图。内部逻辑就是通过ViewDragHelper.findTopChildUnder获取的View,然后判断是否是抽屉试图,如果是抽屉试图就可以进行拖拽,所以这里我们直接让他获取到。
// 此代码在ViewDragHelper类中
@Nullable
public View findTopChildUnder(int x, int y) {
/*final int childCount = mParentView.getChildCount();
for (int i = childCount - 1; i >= 0; i--) {
final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i));
if (x >= child.getLeft() && x < child.getRight()
&& y >= child.getTop() && y < child.getBottom()) {
return child;
}
}
return null;*/
for (int i = 0; i < mParentView.getChildCount(); i++) {
View child = mParentView.getChildAt(i);
final int gravity = ((CustomDrawerLayout.LayoutParams) child.getLayoutParams()).gravity;
final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
ViewCompat.getLayoutDirection(child));
// 这里可以根据手势,来返回抽屉对象,我这里就左边的就够用了
if ((absGravity & Gravity.LEFT) != 0) {
// This child is a left-edge drawer
return child;
}
}
return null;
}