android setTransparentRegion的方法

Android 专栏收录该内容
234 篇文章 0 订阅
final View view = getWindow().getDecorView();
try {
    Method mm = view.getClass().getMethod("getViewRootImpl");
    Object viewRootImpl = mm.invoke(view);
    for (Method m : viewRootImpl.getClass().getMethods()) {
        Log.e("methods", m.toString());
    }
    for (Field m : viewRootImpl.getClass().getFields()) {
        Log.e("fields", m.toString());
    }

    Field fieldWindow = viewRootImpl.getClass().getDeclaredField("mWindow");
    fieldWindow.setAccessible(true);
    Object window = fieldWindow.get(viewRootImpl);

    Field fieldSession = viewRootImpl.getClass().getDeclaredField("mWindowSession");
    fieldSession.setAccessible(true);
    Object session = fieldSession.get(viewRootImpl);

    Log.e("windowSession", session.toString());

    Method method = session.getClass().getMethod("setTransparentRegion",
            Class.forName("android.view.IWindow"),
            Class.forName("android.graphics.Region"));

    method.invoke(session, window, new Region(0, 0, view.getWidth(), view.getHeight() / 2));
    Log.e("success", method.toString() + session.toString());
} catch (Throwable e) {
    e.printStackTrace();
}

用android11,已经没有mWindowSession的对象了,但是在低版本的系统上,是可以的。

  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页

打赏

雨声不在

有收获才赞赏

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值