在阐述我所遇到的问题之前,先通过查看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;
}
对于其他控件,有兴趣者可自行研究,这里不再赘述。