关于dialog显示探究以及去除动画或者居中的高级方法

diaog里的window对象:

我们知道dialog是由window来控制其显示属性的,无所依我们可以在window中去寻找我们需要实现的功能。
看图:

《关于dialog显示探究以及去除动画或者居中的高级方法》 dialog包含的对象

dialog中存在window对象,通常我们动态设置window的宽高,就可以通过getWindow()方法来获取,然后修改。但是还有没有其他方法呢?

那就看window里面的方法:

先说dialog里面的window初始化

《关于dialog显示探究以及去除动画或者居中的高级方法》 dialog初始化

我们可以看到window默认是居中的并且绑定了windowManager,那么是不是window的配置参数可以通过windowManager来控制呢?
那么显示的关键应该是show方法吧:

《关于dialog显示探究以及去除动画或者居中的高级方法》 show()部分代码

从中可以看到show的方式的确是windowmanager里的参数控制,并通过将decor添加到manager里显示,我们看到了我们平时修改dialog样式的熟悉的方法
WindowManager.LayoutParams l = mWindow.getAttributes()通过这个方法,我们能拿到对应的LayoutParams 来修改。

那么dismiss()方法应该也是一样的,应该也是从windowManager里移除掉对应的decorview:

《关于dialog显示探究以及去除动画或者居中的高级方法》 dismiss())

那么既然window是受windowManager控制,是不是可以在windowManager里找到方法修改?
window是一个抽象类,先看看window类,里面很多都是需要phonewindow具体实现的方,phonewindow主要是实现一些事件的分发等,但是有些方法是已经实现的了,但是一些关于window参数的方法,其已经实现了:

《关于dialog显示探究以及去除动画或者居中的高级方法》 flag参数设置

可以看到一些window参数的设置是已经实现了,其具体实现就是以下的两个方法:

《关于dialog显示探究以及去除动画或者居中的高级方法》 具体实现方法

getAttributes()方法就是设置window对象一些位置以及动画等flag的重要方法,那么如果想修改,是不是可以通过invoke这个方法,动态修改flag来实现呢?
具体这些flag当然是出自windowManager里的,我们可以在windowManager里找到

《关于dialog显示探究以及去除动画或者居中的高级方法》 windowManager

一系列的flag,所依我们实现的方法就是来invoke这个
setPrivateFlags()方法,来修改我们想要。

具体如下:

private static void setDialogNoAnimate(Window window)
 {  
try {
Method method=Window.class.getDeclaredMethod("setPrivateFlags",int.class,int.class);   
method.setAccessible(true); 
method.invoke(window,PRIVATE_FLAG_PREVENT_DIALOG_NO_ANIMATE,PRIVATE_FLAG_PREVENT_DIALOG_NO_ANIMATE );
    } catch(Exception e) {
        e.printStackTrace();
    }
}

通过获取这个setPrivateFlags这个方法,然后修改其参数,可以达到我们想要修改的目的。

结语

只是简单介绍了一些可用的方法,可以看情况来使用,有不对之处,敬请指出。

    原文作者:NKming
    原文地址: https://www.jianshu.com/p/d27ee1c1b27a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞