在使用安卓进行布局的时候,时常会用到动态布局,这个时候会动态的去设置一些组建的宽或者高来达到预定的效果
设置宽高的参照,多数为屏幕宽高或者其他某个组件的宽高,例如占屏幕宽高的百分之多少。
首先,获取屏幕宽高的方法:
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int dm_width = metrics.widthPixels; int dm_height = metrics.heightPixels;
dm_width为屏幕宽,dm_height为屏幕高
dm_width*0.8即位占屏幕的80%,但用int类型计算会出现一些偏差。当你使用画笔或者动画那些可以使用float类型的方法时建议先转成float再做计算
然后,获取组件的宽高(如果有getWidth和getHeight这两个方法)
假设组建或者布局的对象名为root
宽:root_width = root.getWidth();
高:root_height = root.getHeight();
但这里会有一个问题,假设在oncreate方法里面使用这两个方法去获取组建或布局的宽高,得到的就是0或者任意负数
因为在oncreate的时候,页面各组建的实际宽高并没有被赋值,只有在oncreate方法执行完毕之后,android确定宽高并绘制完成了各组建的get方法才能获取到实际宽高值
这个时候,如果确实要获取组建的宽高有两个方法
一个是等待oncreate执行完毕之后获取,例如设置一个timer,然后在handler里面获取
另外一个是直接设置该组件的宽高,当然,设置完成之后就没必要获取了
设置宽高的问题下面会说明
关于android动态设置组建或布局的宽高
首先说明设置宽高的方法
这里使用layout.params来设置宽高
比如,
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( width, height); root.setLayoutParams(params);
现在说明一些问题
1.目前尚不清楚最外层布局的方式,知道的有兴趣告诉我的朋友请联系我。
2.为组件或者布局设置params的时候,具体类型根据包裹它的父布局类型
例如布局层次为 相对a布局包含线性b布局,b布局包含c组件
那么在设置宽高时,params的类型为:
设置c组件时,包裹他的父布局是线性b布局,则params类型为LinearLayout.LayoutParams params
设置b布局时,包裹他的父布局是相对a布局,则params类型为RelativeLayout.LayoutParams params
3.设置不同的布局,可以设置不同的参数
例如设置相对布局的params的时候,可以设置params.addRule,里面可以设置alignTop这些属性。
//设置贴着父布局的最上面 params.addRule(RelativeLayout.ALIGN_PARENT_TOP); //设置在另一个id为hehe组件或布局的上面 params.addRule(RelativeLayout.ABOVE,R.id.hehe);上面这些rule,在线性布局下是没有的
4.当你动态设置线性布局里面组件的宽高时,如果添加了weight属性,假设在后期的进程中并不需要需改该组件的背景则可以把宽设置为包裹或者填充,如果后期进程任然需要修改该组件的背景,例如点击一下换个图片,当图片过大时有可能放大或缩小该组件的宽高,这里直接设置为一个定值,但由于weight的属性在,所以显示上是不会出现问题的。