前言
最近在一个项目中,需要制作录屏的功能,原先是在应用中有录屏/控制的按钮,思考之下觉得这种效果并不好,因此就想制作一个可以悬浮的悬浮窗,这样不论手机在什么界面中都可以对录屏功能进行控制。
这里就来构建一个桌面的悬浮窗,使用了DataBinding的MVVM模式,这些方面就不再多提。
FloatNormalView
这个是一个普通的悬浮窗,悬浮窗只有一个按钮,点击按钮显示更多的按钮。
首先是页面布局:
name="viewModel"
type="com.example.zjt.floatrecorder.FloatNormalViewModel"/>
android:layout_width="50dp"
android:layout_height="50dp"
android:gravity="center">
android:id="@+id/root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
android:id="@+id/float_id"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/ic_launcher_background"
android:onClick="@{viewModel::onControlClick}"/>
下面一步步的介绍这个悬浮窗的创建。
1 悬浮窗的显示
// 创建WindowManager对象
private WindowManager windowManager;
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// 创建悬浮窗的LayoutParams
private void initLayoutParams() {
try {
DisplayMetrics metrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
lp = new WindowManager.LayoutParams();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
lp.type = WindowManager.LayoutParams.TYPE_TOAST;
}
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
lp.gravity = Gravity.START | Gravity.TOP;
lp.x = screenWidth - view.getLayoutParams().width * 2;
lp.y = 0;
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.format = PixelFormat.TRANSPARENT;
} catch (Exception e) {
}
}