WindowManager距离左边一段距离 WindowManager+DrawerLayout 实现WindowManager边缘左侧任意位置划出DrawerLayout 具体实现
时间: 2023-08-24 21:05:07 浏览: 45
要实现 WindowManager 边缘左侧任意位置划出 DrawerLayout,可以按照以下步骤进行:
1. 创建一个自定义的 View,用于响应手势事件。
2. 在 onCreate() 方法中,通过 WindowManager 将该 View 添加到屏幕上,并设置 layoutParams,使其位于屏幕左侧。
3. 在该 View 的 onTouchEvent() 方法中,监听手势事件,并根据事件的滑动距离,调整 DrawerLayout 的位置。
具体代码如下:
```java
public class CustomView extends View {
private float mStartX, mStartY;
private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;
private DrawerLayout mDrawerLayout;
private int mScreenWidth;
private int mScreenHeight;
public CustomView(Context context, DrawerLayout drawerLayout) {
super(context);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDrawerLayout = drawerLayout;
DisplayMetrics metrics = new DisplayMetrics();
mWindowManager.getDefaultDisplay().getMetrics(metrics);
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels;
mLayoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT);
mLayoutParams.gravity = Gravity.START | Gravity.TOP;
mLayoutParams.x = 0;
mLayoutParams.y = 0;
mWindowManager.addView(this, mLayoutParams);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mStartX = event.getRawX();
mStartY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float dx = event.getRawX() - mStartX;
float dy = event.getRawY() - mStartY;
mLayoutParams.x = (int) Math.max(0, Math.min(mScreenWidth - mDrawerLayout.getWidth(), dx));
mLayoutParams.y = (int) Math.max(0, Math.min(mScreenHeight - mDrawerLayout.getHeight(), dy));
mWindowManager.updateViewLayout(this, mLayoutParams);
break;
case MotionEvent.ACTION_UP:
if (mLayoutParams.x >= mScreenWidth - mDrawerLayout.getWidth() / 2) {
mLayoutParams.x = mScreenWidth - mDrawerLayout.getWidth();
mWindowManager.updateViewLayout(this, mLayoutParams);
} else {
mLayoutParams.x = 0;
mWindowManager.updateViewLayout(this, mLayoutParams);
}
break;
}
return true;
}
}
```
在 Activity 中创建 CustomView 实例,并将其添加到 DrawerLayout 左侧即可实现。