android - 怎么解释安卓下这种布局?
怪我咯
怪我咯 2017-04-17 17:49:30
0
2
622

代码片段如图,RelativeLayout定了一个固定的高度。

当LinearLayout内容较少时,Srollview维持wrapcontent的表现并在RelativeLayout中垂直居中。

当LinearLayout内容比较多、高度增大到大于RelativeLayout的高度时,ScrollView的高度不会继续变大,而是维持跟Relativelayout一样高并开始可以滚动。

看了一下RelativeLayout和ScrollView的代码都没发现这种“自动加maxHeight”的解释,求高手指点一下这种表现的原理是什么

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(2)
小葫芦

控制項的高度問題看onMeasureonMeasure

直接自己继承ScrollView重写onMeasure方法, 打印传进来的参数如下

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Log.d(TAG, "mode: " + (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST));
    Log.d(TAG, "size: " + MeasureSpec.getSize(heightMeasureSpec));
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

日志打印

mode: true
size: 1581

就可以知道模式是AT_MOST, 也就说高度有限制

看了一下RelativeLayout和ScrollView的代码都没发现这种“自动加maxHeight”的解释,求高手指点一下这种表现的原理是什么

所以maxHeight是在RelativeLayout measureChild

直接自己繼承ScrollView重寫onMeasure方法, 印出來的參數如下#🎜🎜# rrreee #🎜🎜#日誌列印#🎜🎜# rrreee #🎜🎜#就可以知道模式是AT_MOST, 也就說高度有限制#🎜🎜#
#🎜🎜#看了一下RelativeLayout和ScrollView的程式碼都沒發現這種「自動加maxHeight」的解釋,求高手指點一下這種表現的原理是什麼#🎜🎜#
#🎜🎜#所以maxHeight是在RelativeLayout measureChild中加進去的.#🎜🎜#
伊谢尔伦

受 @assistne 啟發,去查了下RelativeLayout的源碼
在 getChildMeasureSpec方法中發現瞭如下代碼

} else if (childSize == LayoutParams.WRAP_CONTENT) {
                // Child wants to wrap content. Use AT_MOST
                // to communicate available space if we know
                // our max size
                if (maxAvailable >= 0) {
                    // We have a maxmum size in this dimension.
                    childSpecMode = MeasureSpec.AT_MOST;
                    childSpecSize = maxAvailable;
                } else {
                    // We can grow in this dimension. Child can be as big as it
                    // wants
                    childSpecMode = MeasureSpec.UNSPECIFIED;
                    childSpecSize = 0;
                }
            }

而getChildMeasureSpec()方法最終被onMeasure()透過measureChild()和measureChildHorizo​​ntal()間接呼叫。

排除一些特殊情況,一般情況下,RelativeLayout的子控件,如果設定為WRAP_CONTENT,則在佈局時會有最大尺寸限制。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板