界面编程与视图的组件
视图组件与容器组件
Android应用的绝大部分UI组件都放在android.widget包及其子包、android.view包及其子包中,Android应用的所有UI组件都继承了View类。
View类还有一个重要的子类:ViewGroup,但ViewGroup通常作为其他组件的容器使用。
Android的所有UI组件都是建立在View、ViewGroup基础之上的,Android采用了“组合器”设计模式来设计View和ViewGroup:ViewGroup是View的子类,因此ViewGroup也可被当成View使用。ViewGroup作为容器来盛装其它组件,而ViewGroup里除了可以包含普通View组件之外,还可以再次包含ViewGroup组件。
图形用户界面的组件层次Android推荐使用XML布局文件来定义用户界面,而不是使用Java代码来开发用户界面,因此所有组件都提供了两种方式来控制组件的行为:
- 在XML布局文件中通过XML属性进行控制
- 在Java程序代码中通过调用方法进行控制
# View类的XML属性、相关方法及说明
XML属性 | 相关方法 | 说明 |
---|---|---|
android:alpha | setAlpha(float) | 设置该组件的透明度 |
android:background | setBackgroundResource(int) | 设置该组件的背景颜色 |
android:clickable | setClickable(boolean) | 设置该组件是否可以激发单击事件 |
android:contentDescription | setContentDescription(CharSequence) | 设置该组件的主要描述信息 |
android:drawingCacheQuality | setDrawingCacheQuality(int) | 设置该组件所使用的绘制缓存的质量 |
android:fadeScrollbars | setScrollbarFadingEnabled(boolean) | 当不使用该组件的滚动条时,是否淡出显示滚动条 |
android:fadingEdge | setVerticalFadingEdgeEnabled(boolean) | 设置滚动该组件时组件边界是否使用淡出效果 |
android:fadingEdgeLength | getVerticalFadingEdgeLength() | 设置淡出边界的长度 |
android:focusable | setFocusable(boolean) | 设置该组件是否可以得到焦点 |
android:focusableInTouchMode | setFocusableInTouchMode(boolean) | 设置该组件在触摸模式下是否可以得到焦点 |
android:id | setId(int) | 设置该组件的唯一标识,Java代码中可通过findViewById来获取它 |
android:isScrollContainer | setScrollContainer(boolean) | 设置该组件是否是作为可滚动容器使用 |
android:nextFocusDown | setNextFocusDownId(int) | 设置焦点在该组件上,且按向下键时获得焦点的组件ID |
android:nextFocusLeft | setNextFocusLeftId(int) | 设置焦点在该组件上,且按向左键时获得焦点的组件ID |
android:nextFocusRight | setNextFocusRightID(int) | 设置焦点在该组件上,且按向右键时获得焦点的组件ID |
android:nextFocusUp | setNextFocusUpId(int) | 设置焦点在该组件上,且按向上键时获得焦点的组件ID |
android:onClick | 为该组件的单击事件绑定监听器 | |
android:padding | setPadding(int,int,int,int) | 在组件的四边设置填充区域 |
android:paddingBottom | setPadding(int,int,int,int) | 在组件的下边设置填充区域 |
android:paddingLeft | setPadding(int,int,int,int) | 在组件的左边设置填充区域 |
android:paddingRight | setPadding(int,int,int,int) | 在组件的右边设置填充区域 |
android:paddingTop | setPadding(int,int,int,int) | 在组件的上边设置填充区域 |
android:rotation | setRotation(float) | 设置该组件的旋转角度 |
android:rotationX | setRotationX(float) | 设置该组件绕X轴旋转的角度 |
android:rotationY | setRotationX(float) | 设置该组件绕Y轴旋转的角度 |
android:saveEnabled | setSaveEnabled(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:soundEffectsEnabled | setSoundEffectsEnabled(boolean) | 设置该组件被单击时是否使用音效 |
android:tag | 为该组件设置一个字符串类型的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:visibility | setVisibility(int) | 设置该组件是否可见 |
ViewGroup容器控制其子控件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams两个内部类。
# ViewGroup.LayoutParams支持的两个XML属性
XML属性 | 说明 |
---|---|
android:layout_height | 指定该子组件的布局高度 |
android:layout_width | 指定该子组件的布局宽度 |
android:layout_height
和android:layout_width
支持的属性值:
-
match_parent
:指定子组件的高度/宽度与父组件的高度/宽度相同 -
wrap_content
:指定子组件的大小恰好能包裹它的内容即可
# ViewGroup.MarginLayoutParams支持的属性
XML属性|相关方法|说明
---|---
android:layout_marginBottom|setMargins(int,int,int,int)|指定该子组件下边的页边距
android:layout_marginLeft|setMargins(int,int,int,int)|指定该子组件左边的页边距
android:layout_marginRight|setMargins(int,int,int,int)|指定该子组件右边的页边距
android:layout_marginTop|setMargins(int,int,int,int)|指定该子组件上边的页边距
使用XML布局文件控制UI界面
Android推荐使用XML布局文件来控制视图,这样不仅简单、明了,而且可以将应用的视图控制逻辑从Java代码中分离出来,放入XML文件中控制,从而更好地体现MVC原则。
在代码中控制UI界面
虽然Android推荐使用XML布局文件来控制UI界面,但如果开发者愿意,Android允许开发者完全抛弃XML布局文件,完全在Java代码中控制UI界面。
使用XML布局文件和Java代码混合控制UI界面
完全使用Java代码来控制UI界面不仅繁琐,而且不利于解耦;而完全利用XML布局文件来控制UI界面虽然方便、便捷,但难免有失灵活。因此有时候,可能需要混合利用XML布局文件和代码来控制UI界面。
当混合使用XML布局文件和代码来控制UI界面时,习惯上把变化小、行为比较固定的组件放在XML布局文件中管理,而那些变化较多、行为控制比较复杂的组件则交给Java代码来管理。
开发自定义View
当Android系统提供的UI组件不足以满足项目需要时,开发者可以通过继承View来派生自定义组件。
当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法。
通常可以被用户重写的方法如下:
方法名 | 说明 |
---|---|
构造器 | 重写构造器是定制View的最基本方式,当Java代码创建一个View实例,或根据XML布局文件加载并构建界面时将需要调用该构造器 |
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) | 当发生触摸屏事件时触发该方法 |
onWindowFocusChanged(boolean) | 当该组件得到、失去焦点时触发该方法 |
onAttachedToWindow() | 当把该组件放入某个窗口时触发该方法 |
onDetachedFromWindow() | 当把该组件从某个窗口上分离时触发该方法 |
onWindowVisibilityChanged(int) | 当包含该组件的窗口的可见性发生改变时触发该方法 |
网友评论