共计 2439 个字符,预计需要花费 7 分钟才能阅读完成。
实现 Android 利用外悬浮窗的过程能够分为以下步骤:
获取悬浮窗权限:在 AndroidManifest.xml 文件中增加 SYSTEM_ALERT_WINDOW 权限,以容许利用在其余利用下层显示悬浮窗。
创立悬浮窗布局:创立一个布局文件,用于定义悬浮窗的款式和内容。
创立悬浮窗服务:创立一个 Service 类,用于治理悬浮窗的生命周期和操作。
增加显示悬浮窗的代码:在 Service 类中的 onCreate 办法中,通过 WindowManager.LayoutParams 参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到 WindowManager 中进行显示。
增加悬浮窗的触摸事件处理:在 Service 类中的 onCreate 办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。
增加悬浮窗的点击事件处理:在 Service 类中的 onCreate 办法中,为悬浮窗布局设置点击事件监听器,以实现点击悬浮窗进行相应操作的性能。
上面是具体的每一步须要做的操作和代码示例:
第一步:获取悬浮窗权限
在 AndroidManifest.xml 文件中增加以下代码:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
第二步:创立悬浮窗布局
创立一个布局文件,例如 float_window.xml,用于定义悬浮窗的款式和内容。能够应用 LinearLayout 或者 RelativeLayout 等布局容器,依据须要增加相应的控件和款式。
第三步:创立悬浮窗服务
创立一个继承自 Service 的类,例如 FloatWindowService,用于治理悬浮窗的生命周期和操作。
public class FloatWindowService extends Service {// 实现 Service 的相干办法}
第四步:增加显示悬浮窗的代码
在 FloatWindowService 的 onCreate 办法中,通过 WindowManager.LayoutParams 参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到 WindowManager 中进行显示。
@Override | |
public void onCreate() {super.onCreate(); | |
// 创立悬浮窗布局 | |
View floatView = LayoutInflater.from(this).inflate(R.layout.float_window, null); | |
// 设置悬浮窗参数 | |
WindowManager.LayoutParams params = new WindowManager.LayoutParams(); | |
params.width = WindowManager.LayoutParams.WRAP_CONTENT; | |
params.height = WindowManager.LayoutParams.WRAP_CONTENT; | |
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; | |
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; | |
params.format = PixelFormat.TRANSLUCENT; | |
// 获取 WindowManager | |
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); | |
// 增加悬浮窗布局到 WindowManager | |
windowManager.addView(floatView, params); | |
} |
第五步:增加悬浮窗的触摸事件处理
在 FloatWindowService 的 onCreate 办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。
@Override | |
public void onCreate() {super.onCreate(); | |
// ... | |
// 设置悬浮窗触摸事件监听器 | |
floatView.setOnTouchListener(new View.OnTouchListener() { | |
private int lastX; | |
private int lastY; | |
private int paramX; | |
private int paramY; | |
@Override | |
public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) { | |
case MotionEvent.ACTION_DOWN: | |
lastX = (int) event.getRawX(); | |
lastY = (int) event.getRawY(); | |
paramX = params.x; | |
paramY = params.y; | |
break; | |
case MotionEvent.ACTION_MOVE: | |
int dx = (int) event.getRawX() - lastX; | |
int dy = (int) event.getRawY() - lastY; | |
params.x = paramX + dx; | |
params.y = paramY + dy; | |
windowManager.updateViewLayout(floatView, params); | |
break; | |
case MotionEvent.ACTION_UP: | |
// 解决点击事件 | |
break; | |
} | |
return true; | |
} | |
}); | |
} |
第六步:增加悬浮窗的点击事件处理
在 FloatWindowService 的 onCreate 办法中,为悬浮窗布局设置点击事件监听器,以实现点击悬浮窗进行相应操作的性能。