|
|
发表于
2025-10-13 22:14:58
来自手机
|
显示全部楼层
来自 黑龙江
.method public static showBall()V
.registers 7
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.prologue
sget-object v0, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
if-eqz v0, :cond_8 # 如果已经存在,直接返回
return-void
:cond_8
sget-object v0, Lcom/grass/mh/StartFw;->ctx:Landroid/content/Context;
if-nez v0, :cond_d # 检查上下文是否为空
return-void
:cond_d
# 检查悬浮窗权限
invoke-static {v0}, Landroid/provider/Settings;->canDrawOverlays(Landroid/content/Context;)Z
move-result v1
if-nez v1, :cond_1a
# 权限检查失败,可以在这里添加权限请求或提示
const-string v1, "需要悬浮窗权限"
invoke-static {v0, v1}, Lcom/grass/mh/ToastUtil;->show(Landroid/content/Context;Ljava/lang/String;)V
return-void
:cond_1a
# 获取WindowManager
const-string v1, "window"
invoke-virtual {v0, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Landroid/view/WindowManager;
if-nez v1, :cond_25 # 检查WindowManager是否获取成功
return-void
:cond_25
# 加载布局
invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
move-result-object v2
const v3, 0x7f0c0499 # 确保这个布局ID正确
const/4 v4, 0x0
invoke-virtual {v2, v3, v4}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View;
move-result-object v2
if-nez v2, :cond_34 # 检查布局是否加载成功
return-void
:cond_34
sput-object v2, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
# 创建布局参数
new-instance v3, Landroid/view/WindowManager$LayoutParams;
invoke-direct {v3}, Landroid/view/WindowManager$LayoutParams;-><init>()V
# 根据Android版本设置type
sget v4, Landroid/os/Build$VERSION;->SDK_INT:I
const/16 v5, 0x1a
if-lt v4, v5, :cond_47
const/16 v4, 0x7f6 # TYPE_APPLICATION_OVERLAY
:goto_42
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->type:I
# 设置flags - 更安全的标志
const v4, 0x328 # NOT_FOCUSABLE | NOT_TOUCH_MODAL
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->flags:I
# 设置格式
const/4 v4, -0x3 # PixelFormat.TRANSLUCENT
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->format:I
# 设置位置和大小
const/4 v4, 0x0
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->x:I
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->y:I
const/16 v4, 0x50 # 80dp
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->width:I
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->height:I
# 设置gravity
const/16 v4, 0x33 # START | TOP
iput v4, v3, Landroid/view/WindowManager$LayoutParams;->gravity:I
# 添加视图
:try_start_5c
invoke-interface {v1, v2, v3}, Landroid/view/WindowManager;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V
:try_end_5f
.catch Ljava/lang/Exception; {:try_start_5c .. :try_end_5f} :catch_6a
# 设置点击监听
new-instance v4, Lcom/grass/mh/BallClickListener;
invoke-direct {v4}, Lcom/grass/mh/BallClickListener;-><init>()V
invoke-virtual {v2, v4}, Landroid/view/View;->setOnClickListener(Landroid/view/View$OnClickListener;)V
# 设置触摸监听
new-instance v4, Lcom/grass/mh/BallTouchListener;
invoke-direct {v4, v3, v1, v2}, Lcom/grass/mh/BallTouchListener;-><init>(Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager;Landroid/view/View;)V
invoke-virtual {v2, v4}, Landroid/view/View;->setOnTouchListener(Landroid/view/View$OnTouchListener;)V
return-void
:cond_47
const/16 v4, 0x7d2 # TYPE_PHONE
goto :goto_42
:catch_6a
move-exception v4
# 处理异常,比如清除view引用
const/4 v5, 0x0
sput-object v5, Lcom/grass/mh/StartFw;->ballView:Landroid/view/View;
# 可以记录日志或提示用户
const-string v5, "添加悬浮窗失败"
invoke-static {v0, v5}, Lcom/grass/mh/ToastUtil;->show(Landroid/content/Context;Ljava/lang/String;)V
return-void
.end method
ai太好用了 你知道吗 |
|