1. 程式人生 > >關於自定義Dialog更改其在window展現位置

關於自定義Dialog更改其在window展現位置

預期實現一個如下的Dialog
效果圖

使用一下程式碼更改Dialog的位置


 private void updateDialog() {
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        getWindow().setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
        attributes.width = Utils.getScreenWidth(mCxt) - Utils.dip2Pixel(mCxt,16
); attributes.verticalMargin = Utils.dip2Pixel(mCxt,8); attributes.dimAmount = 0.5f; getWindow().setAttributes(attributes); }

這段程式碼很簡單,就是拿到對用的windowManager.Layoutparams來進行設定相關的屬性。但是實際效果發現沒有按預期實現。verticalMargin沒有生效,來看下verticalMaring的原始碼
這裡寫圖片描述
讓我們去Gravity的apply函式找具體的用法,對應的變數為yAdj
這裡寫圖片描述


圈紅的意思為如果是設定了TOP或者BOTTOM則對應的調整位置,但是實際上缺不生效。原因沒有深究。後續 處理吧
下面是使用attribute.y這個屬性,可以正確的調整位置

 private void updateDialog() {
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        getWindow().setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
        attributes.width = Utils.getScreenWidth
(mCxt) - Utils.dip2Pixel(mCxt,16); attributes.y = Utils.dip2Pixel(mCxt,8); attributes.dimAmount = 0.5f; getWindow().setAttributes(attributes); }

看下y的原始碼:
這裡寫圖片描述
只要不是預設的Gravity,在使用TOP和Bottom的時候可以提供調整邊緣的offset 。親測顯示完全符合預期。