關於自定義Dialog更改其在window展現位置
阿新 • • 發佈:2019-02-05
預期實現一個如下的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 。親測顯示完全符合預期。