Android开发笔记(三十五)页面布局视图
布局视图的类别
布局视图有五类,分别是线性布局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开发笔记(三十五)页面布局视图相关推荐
- Android开发笔记(十五)淡入淡出动画TransitionDrawable
说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换.如果我们想要从A图片逐渐变为B图片,也就是要实 ...
- 【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论
看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章,作为我们<Visual C++游戏开发>专栏的游戏引擎导论,也 ...
- 游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8250057 作者:毛星云(浅墨 ...
- Android开发笔记(九十五)自定义Drawable
Drawable Bitmap是Android对图像的定义描述,而Drawable则是对图像的展现描述,在View视图中显示图像都是通过Drawable来实现的.其中有关Bitmap的介绍参见< ...
- Android开发笔记(一百五十七)使用OpenGL实现翻书动画
上一篇文章介绍了如何通过纹理渲染绘制地球仪,当然OpenGL的三维图形处理能力是很强大的,只要善于利用OpenGL,就能很方便地虚拟各种现实生活中的动画效果.本文再来谈谈使用OpenGL实现浏览电子书 ...
- Android开发笔记(一百五十四)OpenGL的画笔工具GL10
上一篇文章介绍了OpenGL绘制三维图形的流程,其实没有传说中的那么玄乎,只要放平常心把它当作一个普通控件就好了,接下来继续介绍OpenGL具体的绘图操作,这项工作得靠三维图形的画笔GL10来完成了. ...
- Android开发笔记(一百五十九)Android7.0的分屏模式
现在的手机屏幕越来越大,使得在屏幕上同时开多个窗口不再奢侈,因此Android从7.0开始顺势推出了分屏功能,也被称作多窗口模式.比如把竖长的手机屏幕分成上下两个窗口,一边在上面的窗口中观看电影,一边 ...
- Android开发笔记(一百五十八)运行时动态授权管理
App开发过程中,涉及到硬件设备的操作,比如拍照.录音.定位等等,都要在AndroidManifest.xml中声明相关的权限.可是Android系统为了防止某些App滥用权限,从而允许用户在系统设置 ...
- Android开发笔记(一百五十六)通过渲染纹理展示地球仪
上一篇文章介绍了如何使用GL10描绘三维物体的线段框架,后面给出的立方体和球体效果图,虽然看起来具备立体的轮廓,可离真实的物体还差得远.因为现实生活中的物体不仅仅有个骨架,还有花纹有光泽(比如衣服), ...
- Android开发笔记(一百五十五)利用GL10描绘点、线、面
上一篇文章介绍了GL10的常用方法,包括如何设置颜色.如何指定坐标系.如何调整镜头参数.如何挪动观测方位等等,不过这些方法只是绘图前的准备工作,真正描绘点.线.面的制图工作并未涉及,那么本文就来谈谈如 ...
最新文章
- 手绘图解 | 机器学习最常见的30个基本概念
- ubuntu系统安装FTP
- java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
- CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决
- Raw_Socket原始套接字
- mongodb环境安装
- 图片测量尺寸软件_3D扫描之工件测量检测
- Python面向对象程序设计中属性的作用与用法
- BufferedReader类
- Java下使用Apache POI生成具有三级联动下拉列表的Excel文档
- 【Python】int binary str 互转
- Linux FTP 服务器配置简单说明
- 从浏览器缓存提取媒体文件
- 例外被抛出且未被接住问题
- 基于SSM的汽车租赁系统
- 微信公众平台、微信开放平台、微信商户平台的区别
- 外省市机动车驾驶证换领本市机动车驾驶证
- 国科大英语Unit4
- 编辑网页document.body.contentEditable=‘true‘;
- 聊聊一周的启发,关于读书和职场
热门文章
- Leetcode每日一题:26.remove-duplicates-from-sorted-array(删除排序数组中的重复项)
- Leetcode每日一题:7.整数反转
- 字典的修改,删除,查找,遍历操作
- pytorch: where、gather函数
- 吴恩达机器学习ex7:PCA降维
- kitti百度网盘分享 kitti百度云盘,全套kitti分享 自动驾驶
- BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
- 记录一个crontab的中使用python脚本的坑
- DirectX 3D 设备丢失(lost device)的处理
- 分布式服务框架原来与实践 读书笔记一