布局视图的类别

布局视图有五类,分别是线性布局LinearLayout、相对布局RelativeLayout、框架布局FrameLayout、绝对布局AbsoluteLayout、表格布局TableLayout。其中最常用的是LinearLayout,它适用于包括简单布局在内的多数情况;其次常用的是RelativeLayout,它适用于一些复杂布局,主要是对相对位置要求较多的情况;再次就是FrameLayout,它一般用于需要叠加展示的场合,比如说给整个页面设置一个背景布局等等。AbsoluteLayout和TableLayout实际中很少用,基本不用关心。

另外还有纵向滚动视图ScrollView,以及横向滚动视图HorizontalScrollView,其作用顾名思义便是让它们的子视图可以在某个方向上滚动罢了。

布局xml属性的定义

最基本的宽高如layout_width、layout_height取值类型有两类,分别是match_parent/fill_parent(这两个都表示与上级视图一致),以及wrap_content(这个表示按照内容大小自适应)。

下面是几个容易混淆的通用属性:
1、layout_gravity和gravity的区别 : layout_gravity指的是当前视图位于上级视图的哪个位置,而gravity指的是下级视图位于当前视图的哪个位置。
2、layout_margin和padding的区别 : layout_margin指的是当前视图与外部视图的距离,这个margin部分不属于当前视图;padding指的是当前视图与其内部视图的距离,这个padding部分属于当前视图。为了更直观地感觉,我们可以做个实验,给当前视图设置背景色,然后同时设置layout_margin和padding。结果会发现,margin部分没有背景色,而padding部分是有背景色的。
3、visibility各取值的区别 : 该属性有三个取值,分别是:visible表示可见,invisible表示不可见,gone表示消失。初学者有时分不清invisible和gone的区别,其实它们的区别很简单,invisible虽然看不到但还占着位置,看起来那里就是有块空白;gone不但看不到而且也不占位置了,看上去是不留痕迹的消失掉了。
4、layout_weight : 该属性表示当前视图宽或高的权重,但这个权重不是把上级视图的所有空间拿来分配,只是把上级视图的剩余空间拿来分配。所以如果layout_width或者layout_height设置为wrap_content,此时再设置layout_weight,往往发现每个视图的空间并非希望得到的,因为上级视图先扣掉子视图wrap_content后的长度,最后的剩余长度才拿来按照权重分配,所以当然不是我们想要的结果。正确的做法是,把layout_width或者layout_height设置为0dp,同时再指定各下级视图的layout_weight,这表示所有的下级视图都不占空间,那么上级视图的所有空间都剩下来了,此后把所有空间按照权重分配给每个下级视图,才能得到我们的期望结果。

然后是每种布局视图各自要另外指定的属性。具体如下:

LinearLayout需要指定的是orientation,具体取值大家都很熟悉了:vertical表示垂直布局;horizontal表示水平布局。不过该属性值默认是horizontal,可能出乎多数人的意料,因为大家感觉手机APP理应是从上往下垂直布局,所以这里要特别注意垂直布局一定要设置orientation,不然默认水平布局不符合多数业务场景。

RelativeLayout额外多出了下列的相对位置属性:
layout_toLeftOf : 在指定视图左边
layout_toRightOf : 在指定视图右边
layout_above : 在指定视图上方
layout_below : 在指定视图下方
layout_centerInParent : 在上级视图中间
layout_alignParentLeft : 与上级视图左侧对齐
layout_alignParentTop : 与上级视图上边对齐
layout_alignParentRight : 与上级视图右侧对齐
layout_alignParentBottom : 与上级视图下边对齐
layout_alignParentStart : 为了适配一些从右到左阅读习惯的地区。比如你要适配阿拉伯语的时候,start就代表右边,中文就是左边。
layout_alignParentEnd : 作用类似layout_alignParentStart

FrameLayout没有要特别指定的属性。

ScrollView因为是纵向滚动,所以android:layout_width只能是match_parent或具体数值,不能是wrap_content;android:layout_height则必须是wrap_content。相应的,HorizontalScrollView因为是横向滚动,所以android:layout_height只能是match_parent或具体数值,不能是wrap_content;android:layout_width则必须是wrap_content。

布局属性的代码编写

常用的如setLayoutParams、setGravity、setVisibility、setPadding等方法就不多说了,所有的控件和视图都可以使用这些方法,下面只列出几个需要特别处理的方法。

设置margin
方式一:

     ViewGroup.MarginLayoutParams vg_params = new ViewGroup.MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);vg_params.setMargins(0, 0, 0, 0);

方式二:

     LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);ll_params.setMargins(0, 0, 0, 0);

方式三:

     RelativeLayout.LayoutParams rl_params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rl_params.setMargins(0, 0, 0, 0);

其实setMargins来源于ViewGroup.MarginLayoutParams,后两种方式的LayoutParams都是继承自ViewGroup.MarginLayoutParams

设置weight
方式一:

     LinearLayout.LayoutParams ll_params1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);ll_params1.weight = 1;

方式二:

     LinearLayout.LayoutParams ll_params2 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1);

从以上可以看出,只有LinearLayout.LayoutParams才可以设置weight

设置相对位置
相对位置必然要使用相对布局的参数设置,即addRule方法。该方法的第一个参数表示相对位置的属性,如是在相对上方还是相对下方还是相对左边还是相对右边,第二个参数表示视图id,即表示当前视图要相对于哪个视图。示例代码如下:

     RelativeLayout.LayoutParams rl_params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);rl_params.addRule(RelativeLayout.ABOVE, 1);rl_params.addRule(RelativeLayout.BELOW, 1);rl_params.addRule(RelativeLayout.LEFT_OF, 1);rl_params.addRule(RelativeLayout.RIGHT_OF, 1);

点此查看Android开发笔记的完整目录

Android开发笔记(三十五)页面布局视图相关推荐

  1. Android开发笔记(十五)淡入淡出动画TransitionDrawable

    说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换.如果我们想要从A图片逐渐变为B图片,也就是要实 ...

  2. 【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章,作为我们<Visual C++游戏开发>专栏的游戏引擎导论,也 ...

  3. 游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8250057 作者:毛星云(浅墨 ...

  4. Android开发笔记(九十五)自定义Drawable

    Drawable Bitmap是Android对图像的定义描述,而Drawable则是对图像的展现描述,在View视图中显示图像都是通过Drawable来实现的.其中有关Bitmap的介绍参见< ...

  5. Android开发笔记(一百五十七)使用OpenGL实现翻书动画

    上一篇文章介绍了如何通过纹理渲染绘制地球仪,当然OpenGL的三维图形处理能力是很强大的,只要善于利用OpenGL,就能很方便地虚拟各种现实生活中的动画效果.本文再来谈谈使用OpenGL实现浏览电子书 ...

  6. Android开发笔记(一百五十四)OpenGL的画笔工具GL10

    上一篇文章介绍了OpenGL绘制三维图形的流程,其实没有传说中的那么玄乎,只要放平常心把它当作一个普通控件就好了,接下来继续介绍OpenGL具体的绘图操作,这项工作得靠三维图形的画笔GL10来完成了. ...

  7. Android开发笔记(一百五十九)Android7.0的分屏模式

    现在的手机屏幕越来越大,使得在屏幕上同时开多个窗口不再奢侈,因此Android从7.0开始顺势推出了分屏功能,也被称作多窗口模式.比如把竖长的手机屏幕分成上下两个窗口,一边在上面的窗口中观看电影,一边 ...

  8. Android开发笔记(一百五十八)运行时动态授权管理

    App开发过程中,涉及到硬件设备的操作,比如拍照.录音.定位等等,都要在AndroidManifest.xml中声明相关的权限.可是Android系统为了防止某些App滥用权限,从而允许用户在系统设置 ...

  9. Android开发笔记(一百五十六)通过渲染纹理展示地球仪

    上一篇文章介绍了如何使用GL10描绘三维物体的线段框架,后面给出的立方体和球体效果图,虽然看起来具备立体的轮廓,可离真实的物体还差得远.因为现实生活中的物体不仅仅有个骨架,还有花纹有光泽(比如衣服), ...

  10. Android开发笔记(一百五十五)利用GL10描绘点、线、面

    上一篇文章介绍了GL10的常用方法,包括如何设置颜色.如何指定坐标系.如何调整镜头参数.如何挪动观测方位等等,不过这些方法只是绘图前的准备工作,真正描绘点.线.面的制图工作并未涉及,那么本文就来谈谈如 ...

最新文章

  1. 手绘图解 | 机器学习最常见的30个基本概念
  2. ubuntu系统安装FTP
  3. java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
  4. CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决
  5. Raw_Socket原始套接字
  6. mongodb环境安装
  7. 图片测量尺寸软件_3D扫描之工件测量检测
  8. Python面向对象程序设计中属性的作用与用法
  9. BufferedReader类
  10. Java下使用Apache POI生成具有三级联动下拉列表的Excel文档
  11. 【Python】int binary str 互转
  12. Linux FTP 服务器配置简单说明
  13. 从浏览器缓存提取媒体文件
  14. 例外被抛出且未被接住问题
  15. 基于SSM的汽车租赁系统
  16. 微信公众平台、微信开放平台、微信商户平台的区别
  17. 外省市机动车驾驶证换领本市机动车驾驶证
  18. 国科大英语Unit4
  19. 编辑网页document.body.contentEditable=‘true‘;
  20. 聊聊一周的启发,关于读书和职场

热门文章

  1. Leetcode每日一题:26.remove-duplicates-from-sorted-array(删除排序数组中的重复项)
  2. Leetcode每日一题:7.整数反转
  3. 字典的修改,删除,查找,遍历操作
  4. pytorch: where、gather函数
  5. 吴恩达机器学习ex7:PCA降维
  6. kitti百度网盘分享 kitti百度云盘,全套kitti分享 自动驾驶
  7. BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
  8. 记录一个crontab的中使用python脚本的坑
  9. DirectX 3D 设备丢失(lost device)的处理
  10. 分布式服务框架原来与实践 读书笔记一