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;
			}

对于其他控件,有兴趣者可自行研究,这里不再赘述。




展开阅读全文

没有更多推荐了,返回首页