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_heightandroid: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) 当包含该组件的窗口的可见性发生改变时触发该方法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容