这一篇主要记录app表面上可以看得到的东西(UI布局等)。
所有的用户界面元素都是由View和ViewGroup的对象构成的。
- View:是绘制在屏幕上的用户能与之交互的一个对象。
- ViewGroup:则是一个用于存放其他View(和ViewGroup)对象的布局容器。
- 安卓的八大常用控件:TextView,EditText,Button,CheckBox,RadioButton,ImageView,ImageButton,ProgressBar
- Android六大基本布局:线性布局LinearLayout、表格布局TableLayout、相对布局RelativeLayout、层布局FrameLayout、绝对布局AbsoluteLayout、网格布局GridLayout。(其中,表格布局是线性布局的子类。网格布局是android 4.0后新增的布局。在手机程序设计中,绝对布局基本上不用,用得相对较多的是线性布局和相对布局。)
六大布局:
1.线性布局:
LinearLayout是用的较多的布局,它的weight(权重)属性,在等比例划分,屏幕适配方面优势较大;但是缺点,就是当界面比较复杂的时候,需要嵌套多层的 LinearLayout,这样就会降低UI Render的效率(渲染速度),而且如果是listview或者GridView上的 item,效率会更低,另外太多层LinearLayout嵌套会占用更多的系统资源,还有可能引发stackoverflow;
Linearlayout是一个视图组,可以在一个方向上垂直或水平对齐所有子项。
andriod:orientation属性指定布局方向。布局组件中的排列方式。vertical(垂直,为默认选项)horizontal(水平)。
andriod:gravity 控件组件包含的子元素的对齐方式。是对元素本身说的,元素本身的文本显示在什么地方。
andriod:layout_gravity控制组件在父容器中的对齐方式。
这两个属性可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical。 而且这些属性是可以多选的,用“|”分开。默认值是left。
andriod:width 布局的宽度,通常不写数字,用wrap_content,fill_parent,match_parent来表示。
wrap_content设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置Windows控件的Autosize属性为True。
fill_parent设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。match_parentAndroid2.2中match_parent和fill_parent是一个意思 .两个参数意思一样,match_parent更贴切,于是从2.2开始两个词都可以用。那么如果考虑低版本的使用情况你就需要用fill_parent了
andriod:layout_height 高度的参数,和宽度一样。
andriod:id 为组件起一个名字吧,在java文件中通过findViewById(id)找到它。
andriod:background 为组件设置背景,用背景图或者颜色覆盖均可。
android:background="#ffffff" android:background="@drawable/background”(background.png在drawable文件夹下边)
android:layout_weight 权重,划分区域andriod:divider设置分割线图片,showDividers设置分割线所在的位置,有四个可选值none、middle、begining、end。dividerPadding设置分割线的padding。
当 android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。 即:left,right,center_horizontal 是生效的。 当 android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 即:top,bottom,center_vertical 是生效的。
weight权重设置:
- 将涉及到的View的android:layout_width(或height)属性设置为0dp,然后再设置android:layout_weight="1"的比例即可。
- 当android:layout_width(或height)为wrap_content时,直接同上设置比例即可。
- 当android:layout_width(或height)为match_parent(fill_parent)时,需要计算。计算方法:设划分区域为x,各部分权重为yi,则每部分实际的占比为zi=1+(1-x)*yi;
2.相对布局
相对布局有一定的有点,对于线性布局遇到的多层次的问题,相对布局可能仅仅需要一层就可以完成了,以父容器或者兄弟组件参考+margin +padding就可以设置组件的显示位置,是比较方便的,因此,根据实际情况对这两种进行搭配使用提高效率。
基本属性
gravity 设置容器间组件的对齐方式
ignoreGravity 设置了该属性为true的属性组件,不受gravity属性的影响。
根据父容器定位
左对齐:android:layout_alighParentLeft
右对齐:android:layout_alighParentRight
顶端对齐:android:layout_alighParentTop
底部对齐:android:layout_alighParentBottom
水平居中:android:layout_centerHorizontal
垂直居中:android:layout_centerVertical
中央位置:android:layout_centerInParent
根据兄弟器件定位
左边:android:layout_toLeftOf
右边:android:layout_toRightOf
上方:android:layout_above
下方:android:layout_below
对齐上边界:android:layout_alignTop
对齐下边界:android:layout_alignBottom
对齐左边界:android:layout_alignLeft
对齐右边界:android:layout_alignRight
margin 偏移
android:layout_margin: 指定控件的四周的外部留出一定的边距
android:layout_marginLeft: 指定控件的左边的外部留出一定的边距
android:layout_marginTop: 指定控件的上边的外部留出一定的边距
android:layout_marginRight: 指定控件的右边的外部留出一定的边距
android:layout_marginBottom: 指定控件的下边的外部留出一定的边距
padding填充
android:padding :指定控件的四周的内部留出一定的边距
android:paddingLeft: 指定控件的左边的内部留出一定的边距
android:paddingTop: 指定控件的上边的内部留出一定的边距
android:paddingRight: 指定控件的右边的内部留出一定的边距
android:paddingBottom: 指定控件的下边的内部留出一定的边距
margin代表的是偏移,比如marginleft = "5dp"表示组件离容器左边缘偏移5dp; 而padding代表的则是填充,而填充的对象针对的是组件中的元素,比如TextView中的文字 比如为TextView设置paddingleft = "5dp",则是在组件里的元素的左边填充5dp的空间! margin针对的是容器中的组件,而padding针对的是组件中的元素。
3.表格布局
用表格的方式来排列组件,直接设置行列数。
全局属性:
- android:stretchColumns 设置可伸展的列。该列可以向行方向伸展,最多可占据一整行。
- android:shrinkColumns 设置可收缩的列。当该列子控件的内容太多,已经挤满所在行,那么该子控件的内容将往列方向显示。
- android:collapseColumns 设置要隐藏的列。
单元格属性:
- android:layout_column 指定该单元格在第几列显示
- android:layout_span 指定该单元格占据的列数(未指定时,为1)
4.帧布局
直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!虽然默认会将控件放置在左上角,但是也可以通过layout_gravity属性,指定到其他的位置。
- android:foreground:*设置改帧布局容器的前景图像
- android:foregroundGravity:设置前景图像显示的位置
5.网格布局
- 可以自己设置布局中组件的排列方式
- 可以自定义网格布局有多少行,多少列
- 可以直接设置组件位于某行某列
- 可以设置组件横跨几行或者几列
属性:
- android:alignmentMode
说明:当设置alignMargins,使视图的外边界之间进行校准。可以取以下值:
alignBounds – 对齐子视图边界。
alignMargins – 对齐子视距内容。 - android:columnCount
说明:GridLayout的最大列数 - android:rowCount
说明:GridLayout的最大行数 - android:columnOrderPreserved
说明:当设置为true,使列边界显示的顺序和列索引的顺序相同。默认是true。 - android:orientation
说明:GridLayout中子元素的布局方向。有以下取值:
horizontal – 水平布局。
vertical – 竖直布局。 - android:rowOrderPreserved
说明:当设置为true,使行边界显示的顺序和行索引的顺序相同。默认是true。 - android:useDefaultMargins
说明: 当设置ture,当没有指定视图的布局参数时,告诉GridLayout使用默认的边距。默认值是false。 - android:layout_column
说明:显示该子控件的列,例如android:layout_column=”0”,表示当前子控件显示在第1列,android:layout_column=”1”,表示当前子控件显示在第2列。 - android:layout_columnSpan 说明:该控件所占的列数,例如android:layout_columnSpan=”2”,表示当前子控件占两列。
- android:layout_row 说明:显示该子控件的行,例如android:layout_row=”0”,表示当前子控件显示在第1行,android:layout_row=”1”,表示当前子控件显示在第2行。
- android:layout_rowSpan 说明:该控件所占的列数,例如android:layout_rowSpan=”2”,表示当前子控件占两行。android:layout_columnWeight 说明:该控件的列权重,与android:layout_weight类似,例如有GridLayout上两列,都设置android:layout_columnWeight = “1”,则两列各占GridLayout宽度的一半
- android:layout_rowWeight
说明:该控件的行权重,原理同android:layout_columnWeight。
6.绝对布局(单位是dp)
android:layout_width:组件宽度
android:layout_height:组件高度
android:layout_x:设置组件的X坐标
android:layout_y:设置组件的Y坐标
Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
VISIBLE:设置控件可见
INVISIBLE:设置控件不可见
GONE:设置控件隐藏
而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。
参考链接:https://blog.youkuaiyun.com/chindroid/article/details/8000713