一、简介
这个案例就是在桌面上开启一个悬浮窗,悬浮窗里实时显示照相机的内容,可以自由拖动,当在非桌面状态下自动隐藏.如下图所示():
PS:gif都失真了,凑合看,实际中这个窗口是不会闪烁的
我做这个是因为公司项目里在android系统的NavigationBar里显示了行车记录仪,实时录像.我想把类似的思路分享出来.通过这个可以学习TextureView和自定义悬浮窗口的知识.
二、实现
1、显示一个悬浮窗口
在MainActivity里启动一个服务,在服务里进行悬浮窗的操作
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 启动服务,在服务里开启悬浮窗
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
新建一个MyService继承自Service,在onCreate方法里加上如下代码
//对于6.0以上的设备
if (Build.VERSION.SDK_INT >= 23) {
//如果支持悬浮窗功能
if (Settings.canDrawOverlays(getApplicationContext())) {
showWindow();
} else {
//手动去开启悬浮窗
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);
}
} else {
//6.0以下的设备直接开启
showWindow();
}
}
谷歌对于6.0以上的设备,默认是把悬浮窗功能给禁了,所以需要手动去打开.我用的小米就是这样,需要手动在设置里打开显示悬浮窗的权限.
- Settings.canDrawOverlays(context)方法是判断当前系统是否支持悬浮窗
- Settings.ACTION_MANAGE_OVERLAY_PERMISSION 是跳转到打开悬浮窗的ACTION
以上两个都是在6.0以上的SDK里才有.
对于6.0一下的设备可以直接显示.
看下showWindow()里的代码
private void showWindow() {
//创建MyWindow的实例
myWindow = new MyWindow(getApplicationContext());
//窗口管理者
mWindowManager = (WindowManager) getSystemService(Service.WINDOW_SERVICE);
//窗口布局参数
Params = new WindowManager.LayoutParams();
//布局坐标,以屏幕左上角为(0,0)
Params.x = 0;
Params.y = 0;
//布局类型
Params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 系统类型
//布局flags
Params.fla