筆記:
項目需要將一個懸浮窗WindowManager僅顯示view給用戶看,不可操作,將觸摸事件穿透到后面的窗口。WindowManager.LayoutParams代碼如下
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.type = Build.VERSION.SDK_INT < Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
在android12以下的機型中測試都沒問題,觸摸事件可以穿透懸浮窗。但在android 12機型測試時,觸摸事件無法穿透懸浮窗了。
原因
查了android開發(fā)者官網(wǎng)的android12變化后,發(fā)現(xiàn)
解決
方法1:
例外情況下運行執(zhí)行穿透操作,這里就使用無障礙窗口
創(chuàng)建個無障礙服務,在服務連接后回調里創(chuàng)建個無障礙窗口類型的懸浮窗就好了
public class MyAccessibilityService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
createWindow();
}
public void createWindow() {
//懸浮窗類型
int type;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
} else {
type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.type = type;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
wm.addView(view, lp);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
經(jīng)測試有效
方法2:
此方法比方法1更簡單,來源于WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE的源碼注釋。翻譯截圖如下
也就是說,只要在觸摸路徑中,它是該UID下唯一的TYPE_APPLICATION_OVERLAY窗口,并且alpha等于或小于最大遮擋不透明度也就是0.8。那么久可以使用WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE來實現(xiàn)觸摸事件穿透文章來源:http://www.zghlxwxcb.cn/news/detail-541316.html
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.type = Build.VERSION.SDK_INT < Build.VERSION_CODES.O ?
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW;
//將alpha設置為最大遮擋不透明度
lp.alpha = 0.8f;
經(jīng)測試有效文章來源地址http://www.zghlxwxcb.cn/news/detail-541316.html
到了這里,關于android 12后WindowManager事件穿透類型懸浮窗無效問題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!