Android 开发的一项内容就是用户界面的开发, 不过应用包含多么复杂的逻辑, 如果这个应用没有提供友好的图形用户界面(Graphics User Interface, GUI), 最终也将很难吸引用户. (实际上, Windows之所以广为人知, 其最初的吸引力就是来自于它提供的图形用户界面)
Android 提供了大量的UI 组件(如果觉得不够, 可以自己定义, 当然这个属于进阶技能), 只要把这些组件合理的搭建到一起, 就可以设计出优秀的界面.
这些图形用界面是 Android 应用开发的基础, 也是开发重要的组成部分.
View与ViewGroup
Android 所有的UI 组件都继承了View, 它代表一个空白的矩形区域.
View 类有一个重要的子类: ViewGroup, ViewGroup 通常是用作容器使用, 而这时通过组合模式来建立的, 也可以理解为ViewGroup 是一个分支节点, 而View是一个叶子节点:
Android 中推荐使用 XML布局文件来定义用户界面, 其实是使用了MVC模式,
做到界面的与业务逻辑分离,也是解耦的一种体现.
下面是View 对应的XML 属性和方法, 因为View 是UI 组建的基类, 所以所有的组件都可以使用这些方法.
XML属性 | 相关方法 | 说明 |
---|---|---|
android:alpha | setAlpha(float) | 设置该组件的透明度 |
android:background | setBackgroundResource(int) | 设置该组件的背景颜色 |
android:clickable | setClickable(boolean) | 设置该组件是否可以激发点击事件 |
android:contentDescription | setContentDescription (CharSequence) | 设置该组件内容的描述信息 |
android:drawingCacheQuality | setDrawingCacheQuality(int) | 设置该组件所使用的绘制缓存的质量 |
android:elevation | setElevation(float) | 设置该组件”浮”起来的高度, 通过设置该属性可以让该组件呈现3D 效果 |
android:fadeScrollbars | setScrollbarFadingEnabled (boolean) | 当不使用该组件的滚动条时, 是否淡出显示滚动条 |
android:fadingEdge | setVerticalFadingEdgeEnable (boolean) | 设置滚动该组件时, 组件边界是否使用淡出效果 |
android:fadingEdgeLength | setFadingEdgeLength(int) | 设置淡出边界的长度 |
android:focusable | setFocusable(boolean) | 设置该组件是否可以获得焦点 |
android:focusableInTouchMode | setFocusableInTouchMode (boolean) | 设置该组件在触摸模式下是否可以获得焦点 |
android:id | setId(int) | 设置该组件的唯一标识. 在Java 代码中可以通过 findViewById 获取该组件 |
android:isScrollContainer | setScrollContainer(boolean) | 设置该组件是否可以作为滚动容器使用 |
android:keepScreenOn | setKeepScreenOn(boolean) | 设置该组件是否会强制手机屏幕一直打开 |
android:longClickable | setLongClickable(boolean) | 设置该组件是否可以响应长单击事件 |
android:minHeight | setMinimumHeight(int) | 设置该组件的最小高度 |
android:minWidth | setMinimumWidth(int) | 设置该组件的最小宽度 |
android:nextFocusDown | setNextFocusDown(int) | 设置焦点在该组件上时, 单机下方向键时, 获得焦点组件的ID |
android:nextFocusLeft | setNextFocusLeft(int) | 设置焦点在该组件上时, 单机左方向键时, 获得焦点组件的ID |
android:nextFocusRight | setNextFocusRight(int) | 设置焦点在该组件上时, 单机右方向键时, 获得焦点组件的ID |
android:nextFocusUp | setNextFocusUp(int) | 设置焦点在该组件上时, 单机上方向键时, 获得焦点组件的ID |
android: onClick | 为该组件的单击事件绑定监听器 | |
android:padding | setPadding(int, int, int, int) | 在组件的四边设置填充区域 |
android:paddingBottom android:paddingRight android:paddingTop android:paddingLeft | setPadding(int, int, int, int) | 设置组件指定方向的填充区域 |
android:rotation | setRotation(float) | 设置该组件的旋转角度 |
android:rotationX | setRotationX(float) | 设置该组件绕X轴的旋转角度 |
android:rotationY | setRotationY(float) | 设置该组件绕Y轴的旋转角度 |
android: saveEnable | setSaveEnable(boolean) | 如果为false, 那么当该组件被冻结时, 不会保存它的状态 |
android: scaleX | setScaleX(float) | 设置该组件在水平方向上的缩放比 |
android: scaleY | setScaleY(float) | 设置该组件在垂直方向上的缩放比 |
android: scrollX | 设置该组件初始化后的水平滚动偏移 | |
android: scrollY | 设置该组件初始化后的垂直滚动偏移 | |
android: scrollbarAlwaysDrawHorizontalTrack | 设置该组件是否总是显示水品滚动条 | |
android: scrollbarAlwaysDrawVerticalTrack | 设置该组件是否总是显示垂直滚动条 | |
android: scrollbarDefaultDelayBeforeFade | setScrollBarDefaultDelayBeforeFade (int) | 设置滚动条淡出隐藏之前延迟多少秒 |
android: scrollbarFadeDuration | setScrollBarFadeDuration (int) | 设置滚动条淡入淡出隐藏的过程需要多少秒 |
android: scrollbarSize | setScrollBarSize(int) | 设置水平和垂直滚动条的高度 |
android: scrollbarStyle | setScrollBarStyle(int) | 设置滚动条的风格和位置. 该属性支持如下属性值: insideOverlay, insideInset, outsideOverlay, outsideInset |
android: scrollbarThumbHorizontal | 设置该组件水平滚动条的滑块对应的drawable 图像 | |
android: scrollbarThumbVertical | 设置该组件垂直滚动条的滑块对应的drawable 图像 | |
android: scrollbarTrackHorizontal | 设置该组件水平滚动条的轨道对应的drawable 图像 | |
android: scrollbarTrackVertical | 设置该组件垂直滚动条的轨道对应的drawable 图像 | |
android: scrollbars | 定义该组件滚动时显示几个滚动条, 支持一下属性: none 不显示滚动条; horizontal 显示水平滚动条; vertical 显示垂直滚动条; | |
android: soundEffectsEnable | setSoundEffectsEnable(boolean) | 设置该组件单机时是否使用音效 |
android:tag | setTag(Object) | 为该组件设置一个字符串类型的tag 值. 接下来可通过View 的getTag() 获取该字符串, 或通过findViewWithTag() 查找该组价 |
android:transformPivotX | setPivotX(float) | 设置该组件旋转时中心的X 坐标 |
android:transformPivotY | setPivotY(float) | 设置该组件旋转时中心的Y 的坐标 |
android:translationX | setTranslationX(float) | 设置该组件在X方向上的位移 |
android:translationY | setTranslationY(float) | 设置该组件在Y方向上的位移 |
android:translationZ | setTranslationZ(float) | 设置该组件在Z方向上的位移 |
android:visibility | setVisibility(int) | 设置该组件是否可见 |
ViewGroup 的布局排版
ViewGroup 继承了 View 类, 主要是当成布局的容量器来使用. 由于ViewGroup是一个抽象类, 我们通常用他的子类, 比如各种布局管理器.
容器内组件的分布依赖于ViewGroup.LayoutParams 和 ViewGroup.MarginLayoutParams 两个内部类
- ViewGroup.LayoutParams 支持XML 属性
XML属性 | 说明 |
---|---|
android:layout_height | 指定该子组件布局的高度 |
android:layout_widht | 指定该子组件布局的宽度 |
android:layout_height, android:layout_width 两个属性支持如下三个属性值.
fill_parent: 宽高与父容器的宽高相同(减去margin 边距);
match_parent: 同fill_parent, google推荐使用;
wrap_content: 组件的大小刚好能包裹他的内容
- ViewGroup.MarginLayoutParams 支持XML 属性
XML属性 | 相关方法 | 说明 |
---|---|---|
android:layout_marginLeft | setMargin(int,int,int,int) | 指定该子组件左边的页边距 |
android:layout_marginTop | setMargin(int,int,int,int) | 同理,对应setMargin()方法第二个参数 |
android:layout_marginRight | setMargin(int,int,int,int) | 同理, 对应第三个参数 |
android:layout_marginBottom | setMargin(int,int,int,int) | 同理对应第四个参数 |
有关于自定义View 的进阶
自定义View属于andorid 进阶的一项高级技能, 这里只做简单的介绍. 待内功足够深厚, 在做深入探索.
在自定义一个View 时, 通常会重写如下几个方法:
onFinishInflate()
: 这是一个回调方法, 当应用从XML 布局文件加载组件并利用他来构建界面之后, 该方法会被会掉.onMeasure(int, int)
: 调用该方法来检测View 组件及其所报行的所有子组件的大小onLayout(boolean,int,int,int,int)
: 当该组件的大小被改变时会回调该方法.onSizeChanged(int,int,int,int)
: 当该组件的大小被改变时回调该方法.onDraw(Canvas)
: 当该组件将要绘制他的内容时,回调该方法进行绘制.onKeyDown(int,KeyEvent)
: 当某个按健(物理键盘,现在已经不多见了)被按下时触发该方法.onKeyUp(int,KeyEvent)
: 当松开某个键时触发该方法.onTrackballEvent(MotionEvent)
:当发生轨迹球事件是触发该方法.onTouchEvent(MotionEvent)
: 当发生触摸屏事件时触发该方法.onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
: 当该组件的焦点发生改变时触发该方法.onWindowFocusChanged(boolean)
: 当包含该组件的创狗是去或得到焦点时触发该方法.onAttachToWindow()
: 当把该组件放入某个窗口时触发该方法.onDetachedFromWindow()
: 当把该组件从某个窗口上分离时触发该方法.onWindowVisibilityChanged(int)
: 当包含该组件的窗口的可见性发生改变时, 触发该方法.
通常只需要重写几个相应的方法即可, 不需要全部重写.
以上是对界面编程的一个基础的介绍, 可以大体的理解为一个框架,很多细节的东西需要后续添加进来.