Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数

设置flags是否包含某些flag
1666          if (!mFocusable) {
1667              curFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
1668              if (mInputMethodMode == INPUT_METHOD_NEEDED) {
1669                  curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1670              }
1671          } else if (mInputMethodMode == INPUT_METHOD_NOT_NEEDED) {
1672              curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1673          }
1674          if (!mTouchable) {
1675              curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
1676          }
1677          if (mOutsideTouchable) {
1678              curFlags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
1679          }
1680          if (!mClippingEnabled || mClipToScreen) {
1681              curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
1682          }
1683          if (isSplitTouchEnabled()) {
1684              curFlags |= WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
1685          }
1686          if (mLayoutInScreen) {
1687              curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
1688          }
1689          if (mLayoutInsetDecor) {
1690              curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
1691          }
1692          if (mNotTouchModal) {
1693              curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
1694          }
1695          if (mAttachedInDecor) {
1696              curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR;
1697          }
设置gravity

取决于mGravity和mIsDropdown && (mClipToScreen || mClippingEnabled)

mGravity可在showAtLocation中设置

mIsDropdown可以通过set方法直接设置,也可通过调用showAtLocation(设置为false)或调用showAsDropDown(设置为true)

mClipToScreen和mClippingEnabled通过set方法设置

1596      private int computeGravity() {
1597          int gravity = mGravity == Gravity.NO_GRAVITY ?  Gravity.START | Gravity.TOP : mGravity;
1598          if (mIsDropdown && (mClipToScreen || mClippingEnabled)) {
1599              gravity |= Gravity.DISPLAY_CLIP_VERTICAL;
1600          }
1601          return gravity;
1602      }
设置type

通过调用setWindowLayoutType方法设置

设置softInputMode

通过调用setSoftInputMode设置

设置windwAnimations

取决于mAnimationStyle、mIsDropdown、mAboveAnchor

1702      private int computeAnimationResource() {
1703          if (mAnimationStyle == ANIMATION_STYLE_DEFAULT) {
1704              if (mIsDropdown) {
1705                  return mAboveAnchor
1706                          ? com.android.internal.R.style.Animation_DropDownUp
1707                          : com.android.internal.R.style.Animation_DropDownDown;
1708              }
1709              return 0;
1710          }
1711          return mAnimationStyle;
1712      }

设置width/height
在WindowManager.addView之前设置

主要是取决于mXXX、mXXXMode

mXXXMode可通过调用setWindowLayoutMode设置,可设置为MATCH_PARENT或WRAP_CONTENT

1634          if (mHeightMode < 0) {
1635              p.height = mLastHeight = mHeightMode;
1636          } else {
1637              p.height = mLastHeight = mHeight;
1638          }
1639  
1640          if (mWidthMode < 0) {
1641              p.width = mLastWidth = mWidthMode;
1642          } else {
1643              p.width = mLastWidth = mWidth;
1644          }
在WindowManager.addView之后,可通过调用update方法修改

比较新旧值是否相同,不相同再修改

2291          final int finalWidth = mWidthMode < 0 ? mWidthMode : mLastWidth;
2292          if (width != -1 && p.width != finalWidth) {
2293              p.width = mLastWidth = finalWidth;
2294              update = true;
2295          }
2296  
2297          final int finalHeight = mHeightMode < 0 ? mHeightMode : mLastHeight;
2298          if (height != -1 && p.height != finalHeight) {
2299              p.height = mLastHeight = finalHeight;
2300              update = true;
2301          }

设置token

调用showAtLocation, 设置为parent.getWindowToken()

调用showAsDropDown,设置为anchor.getApplicatonWindowToken()

设置format

mBackground通过调用setBackgroundDrawable设置

1628          if (mBackground != null) {
1629              p.format = mBackground.getOpacity();
1630          } else {
1631              p.format = PixelFormat.TRANSLUCENT;
1632          }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值