Android自定义控件布局刷新自定义控件回到初始位置问题的解决

时间:2022-02-05 16:35:43

在阐述我所遇到的问题之前,先通过查看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;
}

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