1 概述
安卓ui
2 基础空间
2.1 ImageView
留意scaleType的用法
- center,将当前的image直接贴到imageview上,不拉伸也不压缩,如果image太大了,就贴image的中心,如果image太小了,就直接贴到imageview的中心
- fitCenter,保证image所有的内容都能放到imageview上,然后另一条边按比例放到ImageView的中心。就是,center+缩小
- centerCrop,保证image具体的内容放在imageview上,然后另一条边剪中心放到ImageView上。就是,center+放大
注意adjustViewBounds的用法,一般用来在控制ImageView的某条边是固定的,另外一边根据Image的比例来控制,只需要设置adjustViewBounds为true就可以了。
3 布局控件
3.1 盒模型
在安卓中,padding属于width与height里面,增加或减少padding,不会影响总的width与height。而margin是子控件在父控件中的布局控制属性。
要注意的是,padding属于点击区域,margin不属于点击区域,如果控件是需要点击的,尽量用padding来实现控件间的距离,而不是margin,否则会让用户很难触摸到控件。
3.2 LinearLayout
线性布局,非常好用。
父控件布局属性
- orientaion控制排列的方向
- gravity控制子控件整体在父控件中布局方式,left,right,center
子控件布局属性
- layout_width,layout_height控制子控件占用区域的大小
- layout_weight控制当多个子控件都是0dp时,这些子控件按照什么比例来获取空间,一般用来平分控件空间。注意,layout_weight跟你想的不太一样
- layout_gravity控制本个单个子控件相对于父控件的布局方式。
3.3 FrameLayout
多个子控件叠加在同一层的布局方式,一般用来做tab模型,或者按需显示控件的布局,很简单。
3.4 Space
建立一个Space空间来占位,比用空View占位来省资源
3.5 FAQ
3.5.1 空隙平分控件
问:假设有3个控件在同一行,这三个控件总宽度是屏幕宽度,每个控件的宽度是固定的,要求这三个控件之间的空隙是动态平分剩余空隙的。
答:解决办法很简单,将空隙也看成一个view,然后将view的layout_width设置为match_parent,layout_weight都是1,即可。
4 列表控件
4.1 ListView
4.2 RecycleView
4.3 优化
- 重用view
- 利用viewholder减少findViewById
- 异步加载view的数据
- 滚动停顿加载view的数据
- 减少单独列表捆绑事件
5 样式
5.1 边框,圆角,渐变背景
在html中,这几种都是有自己的独特的属性的。而在android,全部都归到background的范畴。
<shape android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#d2d2d2" />
<solid
android:color="#ffffff"/>
</shape>
简单定义一个边框,和背景色
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="-1dp"
android:top="-1dp"
android:right="-1dp">
<shape android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#d2d2d2" />
<solid
android:color="#ffffff"/>
</shape>
</item>
</layer-list>
要定义单边边框的话,安卓中很麻烦,要用layer-list来偏移背景来实现。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#ffffff"/>
<padding
android:bottom="10dp"/>
<corners
android:radius="15dp"/>
</shape>
定义一个带有圆角的shape
6 自定义view
在安卓中,你可以全用代码来绘ui,也可以用xml来结合写ui,很明显,后面的方式,写起来容易,维护性也很好。
6.1 基本步骤
- 先写一个view,例如,LinearLayout
- 定义一个layout,然后将LayoutInflator将布局设置进view中
- 用findViewById来获取布局里的小view,用来做自定义view的动态控制
6.2 layoutinflator
public View inflate(int resource, ViewGroup root, boolean attachToRoot)
- attachToRoot为true时,会将生成的view放入到root下,并返回rootView。
- attachToRoot为false时,会将生成的view不放入到root下,并返回生成的view。
public View inflate(int resource, ViewGroup root)
- ViewGroup传入null,凭空生成一个View
6.3 merge
merge标签是用来优化自定义view的,由于自定义view的顶层已经是一个控件了,layoutinflator又生成了一个同样的顶层的父控件,造成实例化时有多余的标签生成。merge标签能优化这种问题,但要注意的是,merge标签的属性不会嵌入到父控件上,请不要在merge标签上定义属性,那是没有用的。
7 常用组件
7.1 下拉刷新
Android-Ultra-Pull-To-Refresh,如其名,简单暴力,功能强大。
7.2 Gif图片
安卓的ImageView默认是不能显示Gif图片的,一般用Glide来补充实现。
7.3 顶部状态条
StatusBarUtil,用来统一设置各种机型的顶部状态栏样式,用来实现沉浸式状态栏。
注意,使用了这个控件后,需要留意以下几点:
- 务必顶层控件是继承于ViewGroup的容器控件,不然在部分机型有崩溃问题
- 顶层控件在首次设定了以后,就不要再更改了,也就是setContentView只能调用一次。因为该控件为了配合顶部状态栏样式,会在顶层控件设置fitSystemWindow参数,如果重新再调用一次setContentView,那么新的顶层控件就会丢失fitSystemWindow参数,造成页面控件的部分元素压在了系统状态栏下方
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!