Android精讲--界面编程1(界面编程与视图的组件)
界面编程与视图的组件
视图组件与容器组件
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)
当包含该组件的窗口的可见性发生改变时触发该方法