import android.app.Activity;
import android.graphics.Point;
import androidx.customview.widget.ViewDragHelper;
import androidx.drawerlayout.widget.DrawerLayout;
import java.lang.reflect.Field;
public void setDrawerLeftEdgeSizeAndNoLongPressPopup(Activity activity,
DrawerLayout drawerLayout,
float displayWidthPercentage) {
if (activity != null) {
try {
// displayWidthPercentage传1开启全面屏手势滑动,小于1设定滑动范围
Field leftDraggerField = this.getClass().getSuperclass().getDeclaredField("mLeftDragger");
leftDraggerField.setAccessible(true);
ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(this);
Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize");
edgeSizeField.setAccessible(true);
int edgeSize = edgeSizeField.getInt(leftDragger);
Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(displaySize);
edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) ((float) displaySize.x * displayWidthPercentage)));
// 禁止长按滑出负一屏
// 获取Layout的ViewDragCallBack实例mLeftCallback
// 更改其属性mPeekRunnable
Field leftCallbackField = drawerLayout.getClass().getSuperclass().getDeclaredField("mLeftCallback");
leftCallbackField.setAccessible(true);
// 因为无法直接访问私有内部类,所以该私有内部类实现的接口非常重要,通过多态的方式获取实例
ViewDragHelper.Callback leftCallback = (ViewDragHelper.Callback) leftCallbackField.get(drawerLayout);
Field peekRunnableField = leftCallback.getClass().getDeclaredField("mPeekRunnable");
peekRunnableField.setAccessible(true);
peekRunnableField.set(leftCallback, (Runnable) () -> {
});
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
DrawerLayout开启全屏滑动并禁止长按屏幕弹出
于 2023-01-10 16:11:00 首次发布