1. 程式人生 > >Android自定義控制元件佈局重新整理自定義控制元件回到初始位置問題的解決

Android自定義控制元件佈局重新整理自定義控制元件回到初始位置問題的解決

在闡述我所遇到的問題之前,先通過檢視Android原始碼發現這樣幾個程式碼樣例:

1. 

grep extends\ ViewGroup.MarginLayoutParams  ./core/java/android/widget/ -rn
./core/java/android/widget/RelativeLayout.java:1030:    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
./core/java/android/widget/LinearLayout.java:1739:    public static class LayoutParams extends ViewGroup.MarginLayoutParams {

2.

grep class\ MarginLayoutParams  core/java/android/view/ViewGroup.java -rn  
5376:    public static class MarginLayoutParams extends ViewGroup.LayoutParams {

3.在measureChildWithMargins()方法中發現child.getLayoutParams()得到的LayoutParams可以直接轉換成MarginLayoutParams。
protected void measureChildWithMargins(View child,
            int parentWidthMeasureSpec, int widthUsed,
            int parentHeightMeasureSpec, int heightUsed) {
        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();

        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
                mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin
                        + widthUsed, lp.width);
        final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec,
                mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin
                        + heightUsed, lp.height);

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }


OK,那麼綜上所述,得出的結論是:當一個view子控制元件是使用在RelativeLayout和LinearLayout中的時候,其getLayoutParams()獲取的LayoutParams物件其實是MarginLayoutParams物件的實現。

這個問題解決了我所遇到的一個問題,即我在做一個自定義控制元件的時候,需要控制自定義控制元件的滑動,但是當我改變了頁面的佈局的時候,所有佈局重新重新整理了一邊,這樣導致這個控制元件又回到了起始位置,因此,得出這個結論之後,直接設定其引數即可,比如:

MarginLayoutParams marginLP = (MarginLayoutParams)getLayoutParams();
			if (marginLP != null) {
				marginLP.topMargin = 300;
			}

對於其他控制元件,有興趣者可自行研究,這裡不再贅述。