public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.grid_item)
relativeView=(RelativeLayout)findViewById(R.layout.grid_item)
new Handler().postDelayed(new Runnable(){
@Override
public void run(){
relativeView.setLayoutParams(new RelativeLayout.LayoutParams(100,200))
}
}, 1000) ///延时,或不可行
}
可行方法:
RelativeLayout.LayoutParams linearParams = (RelativeLayout.LayoutParams)mScrollView.getLayoutParams()
linearParams.height = middleHeight
mScrollView.setLayoutParams(linearParams)
设置的控件RelativeLayout 中,如果是 LinerLayout,或者是FrameLayout,做相应改动即可!
LayoutParams params = new LayoutParams(width,height)然后使用RelativeLayout relativeLayout.setLayoutparams(params)就可以在程序中控制RelativeLayout的宽和高了。
不过需要注意的是,LayouParams的导入包的问题,导入的时候会提示很多,一定要选择RelativeLayout.LayoutParams这个才正确,否则出现ClassCastExcetpion异常.
上一篇我们分析了自定义像素的屏幕适配,它是以px为单位,设计的标准机型和显示机型的宽高比,动态缩放view。
现在,我们不用px为单位,而是直接以当前view在父容器中的比例,来缩放view。
比如,我定义一个view,它的宽为父容器的一半,高也为父容器的一半。
既然需要使用自定义属性,首先就需要添加attrs,声明自定义属性。
我们实现的目的是子view以父容器的宽高为标准,按照百分比规定自身宽高,所以需要自定义个ViewGroup用来包裹子view,顺便计算出子view的宽高。
以RelativeLayout为例:
继承了RelativeLayout后,我们不能丢失RelativeLayout原来的属性,还要增加我们自定义的属性。
原始RelativeLayout的属性被定义在RelativeLayout的内部静态类中(LayoutParams)。
该类中定义的如:above、below、center等属性,都是声明在子view中。同时百分比属性也是需要定义在子view中。
所以,我们的自定义百分比布局也需要继承该内部类,再添加自定义属性。
再分析下view的创建与LayoutParams的关系。
onCreateView()中始终需要调用setContentView(layoutID)。
最终在PhoneWindow的setContentView(int layoutResID)方法中,调用方法解析layoutResID
方法一路延伸最终来到LayoutInflater类的inflate()方法。
关键点:源码中,子view的LayoutParams是由父容器的generateLayoutParams()创建
那我们的自定义LayoutParams如何被创建呢?
在父容器中重写generateLayoutParams方法,返回我们子view的LayoutParams。
最终在onMeasure方法中,根据百分比计算出子view的宽高。
整体思路
1、自定义属性。
2、自定义LayoutParams,继承自RelativeLayout.LayoutParams。
3、创建自定义LayoutParams,父容器用generateLayoutParams()方法创建子view的layoutParams。
4、在onMeasure中获取子view的LayoutParams,按比例计算出宽高并赋值。
注意:子view的LayoutParams是由父容器在generateLayoutParams()中创建。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)