(1)添加监听:
ViewTreeObserver viewTreeObserver = mLayout.getViewTreeObserver();
viewTreeObserver.addOnPreDrawListener(mListener);(2)监听内容,调整控件位置:
private ViewTreeObserver.OnPreDrawListener mListener = new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
if (mFirstTime == false) { // 使用标识,只调整一次,需要再次调整时,把标识位置回即可
int height = mLayout.getMeasuredHeight(); // 获取基准控件的高度
RelativeLayout.LayoutParams lp = (LayoutParams) mImg.getLayoutParams(); // 获取需要调整控件的位置参数
lp.bottomMargin = height; // 把距离底部的位置设置为基准控件的高度
mImg.setLayoutParams(lp); // 重新设置位置参数
mFirstTime = true; // 调整标识位
}
return true;
}
};(3)适时remove掉监听,避免造成内存泄露
<span style="white-space:pre"> </span>ViewTreeObserver viewTreeObserver = mLayout.getViewTreeObserver();
<span style="white-space:pre"> </span>viewTreeObserver.removeOnPreDrawListener(mListener);
本文介绍了一种通过监听ViewTreeObserver来调整控件位置,并在合适时机移除监听以避免内存泄露的技术实践。具体步骤包括添加监听、调整控件位置以及适时移除监听。该方法适用于需要在预绘制前进行布局调整的应用场景。
706

被折叠的 条评论
为什么被折叠?



