Android自定义控件布局刷新自定义控件回到初始位置问题的解决
16lz
2021-12-09
在阐述我所遇到的问题之前,先通过查看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;}
对于其他控件,有兴趣者可自行研究,这里不再赘述。
更多相关文章
- Android(安卓)Studio http://schemas.android.com/apk/res/andro
- Android(安卓)declare-styleable:自定义控件的属性(attr.xml,Type
- 【Android】Web开发之使用WebView控件展示Web页面
- android gridview 行高设置
- 三、安卓UI学习(1)
- android用户界面之按钮(Button)教程实例汇
- 在Fragment中设置控件点击方法,执行失败。
- TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
- Android常用控件