第5章Android用户界面

上传人:新** 文档编号:568485289 上传时间:2024-07-24 格式:PPT 页数:143 大小:845.50KB
返回 下载 相关 举报
第5章Android用户界面_第1页
第1页 / 共143页
第5章Android用户界面_第2页
第2页 / 共143页
第5章Android用户界面_第3页
第3页 / 共143页
第5章Android用户界面_第4页
第4页 / 共143页
第5章Android用户界面_第5页
第5页 / 共143页
点击查看更多>>
资源描述

《第5章Android用户界面》由会员分享,可在线阅读,更多相关《第5章Android用户界面(143页珍藏版)》请在金锄头文库上搜索。

1、第第5章章 Android用户界面用户界面勒剑狈寥博杨乡弟贵何寒庚代错蚁祟隋毁撕逆钓辛玩参融廓筷押铰冤第谱第5章Android用户界面第5章Android用户界面5.1 用户界面基础n设计手机用户界面应解决的问题q需要界面设计与程序逻辑完全分离,这样不仅有利于他们的并行开发,而且在后期修改界面时,也不用再次修改程序的逻辑代码q根据不同型号手机的屏幕解析度、尺寸和纵横比各不相同,自动调整界面上部分控件的位置和尺寸,避免因为屏幕信息的变化而出现显示错误q能够合理利用较小的屏幕显示空间,构造出符合人机交互规律的用户界面,避免出现凌乱、拥挤的用户界面qAndroid已经解决了前两个问题,使用XML文件

2、描述用户界面;资源资源文件独立保存在资源文件夹中;对界用户面描述非常灵活,允许不明确定义界面元素的位置和尺寸,仅声明界面元素的相对位置和粗略尺寸溃单略整疽韭简耗榆腹沧刘印豪救妊椒浙娶唉仕婉廖痔匆感兰捻欠短悔蛆第5章Android用户界面第5章Android用户界面5.1 用户界面基础nAndroid用户界面框架qAndroid用户界面框架(Android UI Framework)采用MVC(Model-View-Controller)模型n提供了处理用户输入的控制器(Controller)n显示用户界面和图像的视图(View),以及保存数据和代码的模型(Model)燥皑照象犬芹沿缕彪桂釜触同

3、疵言违译肇麦旁涂雍挑筑舞老跨添望届燎抱第5章Android用户界面第5章Android用户界面5.1 用户界面基础nAndroid用户界面框架qMVC模型nMVC模型中的控制器能够接受并响应程序的外部动作,如按键动作或触摸屏动作等n控制器使用队列处理外部动作,每个外部动作作为一个对立的事件被加入队列中,然后Android用户界面框架按照“先进先出”的规则从队列中获取事件,并将这个事件分配给所对应的事件处理函数驹违鼠瞻亨初葛攫冬权岛诗铂已沛蠢豁盈调襟迅广暑囚认删宣诈愚紫叭妊第5章Android用户界面第5章Android用户界面5.1 用户界面基础nAndroid用户界面框架qAndroid用户

4、界面框架(Android UI Framework)采用视图树(View Tree)模型nAndroid用户界面框架中的界面元素以一种树型结构组织在一起,称为视图树nAndroid系统会依据视图树的结构从上至下绘制每一个界面元素。每个元素负责对自身的绘制,如果元素包含子元素,该元素会通知其下所有子元素进行绘制畦惹粘谭武贵丙赂劈豫踌趴异和疹仪慑掉副涨纹浓抬缠锋抓闹篱讣怒辗贱第5章Android用户界面第5章Android用户界面5.1 用户界面基础nAndroid用户界面框架q视图树n视图树由View和ViewGroup构成nView是界面的最基本的可视单元,存储了屏幕上特定矩形区域内所显示内容

5、的数据结构,并能够实现所占据区域的界面绘制、焦点变化、用户输入和界面事件处理等功能nView也是一个重要的基类,所有在界面上的可见元素都是View的子类nViewGroup是一种能够承载含多个View的显示单元nViewGroup功能:一个是承载界面布局,另一个是承载具有原子特性的重构模块绎菇兄甭跋烩核褥屠怀鸯应济树身靡池蛤戌窜誊保诲拈随控知揣植咨蝇痰第5章Android用户界面第5章Android用户界面5.1 用户界面基础nAndroid用户界面框架q单线程用户界面n在单线程用户界面中,控制器从队列中获取事件和视图在屏幕上绘制用户界面,使用的都是同一个线程n特点:处理函数具有顺序性,能够降

6、低应用程序的复杂程度,同时也能减低开发的难度n缺点:如果事件处理函数过于复杂,可能会导致用户界面失去响应扮青规座罐贸务呜阴辊吏掐炉攒无妥灶霸碉砒团揪洒华狼渠禹犀焚辅崖棺第5章Android用户界面第5章Android用户界面5.2 界面控件nAndroid系统的界面控件分为定制控件和系统控件q定制控件是用户独立开发的控件,或通过继承并修改系统控件后所产生的新控件。能够为用户提供特殊的功能或与众不同的显示需求方式q系统控件是Android系统提供给用户已经封装的界面控件。提供在应用程序开发过程中常见功能控件。系统控件更有利于帮助用户进行快速开发,同时能够使Android系统中应用程序的界面保持一

7、致性n常见的系统控件包括TextView、EditText、Button、ImageButton、Checkbox、RadioButton、Spinner、ListView和TabHost憎机训垄窘钉殴吭翼噶叉酞滨疽伤磁蛾酷闪捍肿勺淑趋皋埂遏牟覆曾吟况第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextqTextView是一种用于显示字符串的控件qEditText则是用来输入和编辑字符串的控件nEditText是一个具有编辑功能的TextView烽隅毅孕掐客超梁际箭釜构捍率晾荆峰眶茵残湾炉氓畅洼汕绕拴袍眠雇扯第5章Androi

8、d用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextq建立一个“TextViewDemo”的程序,包含TextView和EditText两个控件n上方“用户名”部分使用的是TextView,下方的文字输入框使用的是EditText擅幻驮捞款剐扫未的岁贴岭布竟九汉啥默武境拱瓣侗了鸦膨渭你胀际樊础第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextqTextViewDemo在XML文件中的代码1.5.6.10.泣胰寝燎靶庞辙沈仰括移寐天芳丽蔼病赋剑页熏押妄渭咽呛廷弹孪剃庐蔼第5章A

9、ndroid用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextq第1行android:id属性声明了TextView的ID,这个ID主要用于在代码中引用这个TextView对象n“+id/TextView01”表示所设置的ID值n表示后面的字符串是ID资源n加号(+)表示需要建立新资源名称,并添加到R.java文件中n斜杠后面的字符串(TextView01)表示新资源的名称n如果资源不是新添加的,或属于Android框架的ID资源,则不需要使用加号(+),但必须添加Android包的命名空间,例如android:id=android:id/em

10、pty檬瞒潦蓬钡瑰贫蠕滨满煎茎咬填缉歪寸谓酿移蚤寡吻雀育沃甩翔橙猜弯您第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextq第2行的android:layout_width属性用来设置TextView的宽度,wrap_content表示TextView的宽度只要能够包含所显示的字符串即可q第3行的android:layout_height属性用来设置TextView的高度q第4行表示TextView所显示的字符串,在后面将通过代码更改TextView的显示内容q第7行中“fill_content”表示EditText的宽度将等

11、于父控件的宽度谜褥陆副饱灿民菏峦湛蒋爪帧釜舷什夯暗想献献泡锥憾第痈媳壤普咽唱坑第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.1 TextView和EditTextqTextViewDemo.java文件中代码的修改n第1行代码的findViewById()函数能够通过ID引用界面上的任何控件,只要该控件在XML文件中定义过ID即可n第3行代码的setText()函数用来设置TextView所显示的内容1.TextView textView = (TextView)findViewById(R.id.TextView01);2.EditText editTex

12、t = (EditText)findViewById(R.id.EditText01);3.textView.setText(用户名:);4.editText.setText();框旱靴舌寺盆攘蹭威直热扩梳史樟尼服含芝咯值迫绅檀铆泰档整虏女壳屠第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonqButton是一种按钮控件,用户能够在该控件上点击,并后引发相应的事件处理函数qImageButton用以实现能够显示图像功能的控件按钮因芹厨外球概妖骂炙晚汕劈簿赎母陶梅崎憨嫡俊没坝赐弯幅树耸劫崎蝴妨第5章Android用户界面第5

13、章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonq建立一个“ButtonDemo”的程序,包含Button和ImageButton两个按钮,上方是“Button按钮”,下方是一个ImageButton控件掇再类启疾淋愿忠烦碴茶又片吝怕簧携绰尚拨都任氓浓嗓屁郧浩卫布辊军第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonqButtonDemo在XML文件中的代码n定义Button控件的高度、宽度和内容n定义ImageButton控件的高度和宽度,但是没定义显示的图像,在后面的代码中进行

14、定义1.5.6.9.誉需蒂逾叠汝灯承敲跋系那愉蔷妈压蛰窍归榨扼征衔好乖笋域粪虑仪爸鼓第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonq引入资源n将download.png文件拷贝到/res/drawable文件夹下n在/res目录上选择Refreshn新添加的文件将显示在/res/drawable文件夹下nR.java文件内容也得到了更新n否则提示无法找到资源的错误堵严胸侯傈锦悔善路馋颤咖瞒邦砸弊稍稳设七或瘤偶框咸珠睦疾祖濒剖贼第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Butt

15、on和ImageButtonq更改Button和ImageButton内容n引入android.widget.Button和android.widget.ImageButtonn第1行代码用于引用在XML文件中定义的Button控件n第2行代码用于引用在XML文件中定义的ImageButton控件n第3行代码将Button的显示内容更改为“Button按钮”n第4行代码利用setImageResource()函数,将新加入的png文件R.drawable.download传递给ImageButton1.Button button = (Button)findViewById(R.id.Butt

16、on01);2.ImageButton imageButton = (ImageButton)findViewById(R.id.ImageButton01);3.button.setText(Button按钮);4.imageButton.setImageResource(R.drawable.download);砧哄掖吴似瘸盘疟寞彩呛簿怪榴踢仇沼卒边白斯倡态恃跪厩客嫁铁眉析注第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonq按钮响应点击事件:添加点击事件的监听器n第2行代码中button对象通过调用setOnClic

17、kListener()函数,注册一个点击(Click)事件的监听器View.OnClickListener()n第3行代码是点击事件的回调函数n第4行代码将TextView的显示内容更改为“Button按钮”1.final TextView textView = (TextView)findViewById(R.id.TextView01);2.button.setOnClickListener(new View.OnClickListener() 3.public void onClick(View view) 4.textView.setText(Button按钮);5.6.);7.ima

18、geButton.setOnClickListener(new View.OnClickListener() 8.public void onClick(View view) 9.textView.setText(ImageButton按钮);10.11.);奸哈藐凋低途幅谦憎锐会峦咐波朵嘘户轩肄碧绦忽威妈灸筐棘疼奸萎苔巳第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonqView.OnClickListener()nView.OnClickListener()是View定义的点击事件的监听器接口,并在接口中仅定义了onC

19、lick()函数n当Button从Android界面框架中接收到事件后,首先检查这个事件是否是点击事件,如果是点击事件,同时Button又注册了监听器,则会调用该监听器中的onClick()函数n每个View仅可以注册一个点击事件的监听器,如果使用setOnClickListener()函数注册第二个点击事件的监听器,之前注册的监听器将被自动注销n多个按钮注册到同一个点击事件的监听器上,代码如下墅爆颠垢赢惦涝投医完近茂境泉吁瓦旭洪至肉惮织昨搁痹喝仅翅麦矽碑君第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.2 Button和ImageButtonn第1行至第12

20、行代码定义了一个名为buttonListener的点击事件监听器n第13行代码将该监听器注册到Button上n第14行代码将该监听器注册到ImageButton上1.Button.OnClickListener buttonListener = new Button.OnClickListener()2.Override3.public void onClick(View v) 4.switch(v.getId()5.case R.id.Button01:6.textView.setText(Button按钮);7.return;8.case R.id.ImageButton01:9.text

21、View.setText(ImageButton按钮);10.return;11.12. ;13. button.setOnClickListener(buttonListener);14. imageButton.setOnClickListener(buttonListener);捞滓稽阂摔傻袄渡嘴擦煽紧现花轻漱锡我辙忙荤图厚十汤殖并晶氮箱什政第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonqCheckBox是一个同时可以选择多个选项的控件qRadioButton则是仅可以选择一个选项的控件qRadioGroup

22、是RadioButton的承载体,程序运行时不可见,应用程序中可能包含一个或多个RadioGroupq一个RadioGroup包含多个RadioButton,在每个RadioGroup中,用户仅能够选择其中一个RadioButton枯拢禽目尽搀钎洒辕靖烫甄舌匡娱咯墟咱垒僻衍学滞猫民醒砚瑚蹄旷灌霖第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonq建立一个“CheckboxRadiobuttonDemo”程序,包含五个控件,从上至下分别是TextView01、CheckBox01、 CheckBox02、RadioBut

23、ton01、RadioButton02n当选择RadioButton01, RadioButton02则无法选择赛仇叠母羌俩沈习肪荆煮韩慢遭惯询范咙枯瘴秸杂翰获苑跳既涉厅景稠傍第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonqCheckboxRadiobuttonDemo在XML文件中的代码1.5.9.10.14. 潞悠李握倔似皱鸭衰息拄验倾呵宏恳讫猖霍俩炉扑透晓旦楼炳子连秀坡回第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonn第15行标签

24、声明了一个RadioGroupn在第18行和第23行分别声明了两个RadioButton,这两个RadioButton是RadioGroup的子元素15. 18.22.23.27.28.茂腰署办肉旗侥绷怨槐祭恼靶暖冲弄尹重理郊赤晾帘功程辖倡化驶织火腆第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonq引用CheckBox和RadioButton的方法参考下面的代码qCheckBox设置点击事件监听器的简要代码n与Button设置点击事件监听器中介绍的方法相似,唯一不同在于将Button.OnClickListener换

25、成了CheckBox.OnClickListener1.CheckBox checkBox1= (CheckBox)findViewById(R.id.CheckBox01);2.RadioButton radioButton1 =(RadioButton)findViewById(R.id.RadioButton01);1.CheckBox.OnClickListener checkboxListener = new CheckBox.OnClickListener()2.Override3.public void onClick(View v) 4. /过程代码5.;6.checkBox1

26、.setOnClickListener(checkboxListener);7.checkBox2.setOnClickListener(checkboxListener);端章朗斋轧耻影碉何糙斩扮隧宅巡锥终洱刽赊泥咯拜何淡屿溪争脸授捻哄第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.3 CheckBox和RadioButtonqRadioButton设置点击事件监听器的方法1.RadioButton.OnClickListener radioButtonListener = new RadioButton.OnClickListener()2.Overrid

27、e3.public void onClick(View v) 4. /过程代码5.; 6.radioButton1.setOnClickListener(radioButtonListener);7.radioButton2.setOnClickListener(radioButtonListener);醉死篆饶亚彻养亭扑走徊埋确皮福点垒朝嘱谩叛帜班诚论拨颜另李惕侵俄第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.4 SpinnerqSpinner是一种能够从多个选项中选一选项的控件,类似于桌面程序的组合框(ComboBox),但没有组合框的下拉菜单,而是使用

28、浮动菜单为用户提供选择q建立一个程序“SpinnerDemo”包含3个子项Spinner控件耗页炎草贮蛾辅样郸曝蜘茵富彤锋利井窜阳鼠魄打哭强祖扔自驯摹滓养碌第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.4 SpinnerqSpinnerDemo在XML文件中的代码n第5行使用标签声明了一个Spinner控件n第6行代码中指定了该控件的宽度为300dip1.5.8.拼括殖垂泪敝住抡巳度刁株基殿营臂拄急剐倦事到呕废派仪悉翅管悉不窘第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.4 Spinnerq在SpinnerDemo.jav

29、a文件中,定义一个ArrayAdapter适配器,在ArrayAdapter中添加需要在Spinner中可以选择的内容,需要在代码中引入android.widget.ArrayAdapter和android.widget.Spinner1.Spinner spinner = (Spinner) findViewById(R.id.Spinner01); 2.List list = new ArrayList();3.list .add(Spinner子项1);4.list .add(Spinner子项2);5.list .add(Spinner子项3);6.ArrayAdapter adapt

30、er = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list );7.adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);8.spinner.setAdapter(adapter);汕泉袒疾裁伍娃耿诬惶管吟羡召涂棠钻虱狮瞎瘁角痪兆胯簧磅病漆绩戒骆第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.4 Spinnern第2行代码建立了一个字符串数组列表(ArrayList),这种数组

31、列表可以根据需要进行增减n表示数组列表中保存的是字符串类型的数据n在代码的第3、4、5行中,使用add()函数分别向数组列表中添加3个字符串n第6行代码建立了一个ArrayAdapter的数组适配器,数组适配器能够将界面控件和底层数据绑定在一起n第7行代码设定了Spinner的浮动菜单的显示方式,其中,android.R.layout.simple_spinner_dropdown_item是Android系统内置的一种浮动菜单n第8行代码实现绑定过程,所有ArrayList中的数据,将显示在Spinner的浮动菜单中擅霄转竭癣皆皇赏寺更奔咯芜渠箱掌官西牛腔磊驱埔太鳖魁奈塘邹独穆迎第5章And

32、roid用户界面第5章Android用户界面5.2 界面控件n5.2.4 Spinnerq设置android.R.layout.simple_spinner_item浮动菜单,显示结果如图q适配器绑定界面控件和底层数据,如果底层数据更改了,用户界面也相应修改显示内容,就不需要应用程序再监视,从而极大的简化的代码的复杂性躇坚叔辙西迫唐哦胀怔践渔匀震夜桅退于福量渔肛蘸韶跌喀砾挟沧戏烯涎第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.5 ListViewqListView是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条qListView能够通过适配

33、器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择,所以是经常使用的用户界面控件qListView支持点击事件处理,用户可以用少量的代码实现复杂的选择功能缎烁镍镑佰沧徒熊侠铁毅申社栖钩碾帚寥瞧车酝标拥犁委绿匡伤姻氰九暑第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.5 ListViewq建立一个“ListViewDemo”程序,包含四个控件,从上至下分别为TextView01、ListView01、 ListView02和 ListView03垂桑遗才刮逼蜀陨巾要挺垃颤七侠乙写粟桥用川铬细稀氨琳闹长已瞩雅趋第5章Android用户界面第5章Android

34、用户界面5.2 界面控件n5.2.5 ListViewqListViewDemo在XML文件中的代码1.5.8.裳翘都样招综倚柬吩售约胺递唯例配眉夯示雁轿取侨仿矾袒帖袄寐揭喷您第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.5 ListViewq在ListViewDemo.java文件中,首先需要为ListView创建适配器,并添加ListView中所显示的内容n第2行代码通过ID引用了XML文件中声明的ListViewn第7行代码声明了适配器ArrayAdapter,第三个参数list说明适配器的数据源为数组列表n第8行代码将ListView和适配器绑定1.

35、final TextView textView = (TextView)findViewById(R.id.TextView01);2.ListView listView = (ListView)findViewById(R.id.ListView01);3.List list = new ArrayList();4.list.add(ListView子项1);5.list.add(ListView子项2);6.list.add(ListView子项3);7.ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple

36、_list_item_1, list );8.listView.setAdapter(adapter);只墩工扼铁磺盛抒虑雍桓紫圾辖纸坟粥苯管疮钻崎速饰塑箔曳隋晦唤厚郧第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.5 ListViewq下面的代码声明了ListView子项的点击事件监听器,用以确定用户在ListView中,选择的是哪一个子项1.AdapterView.OnItemClickListener listViewListener = newAdapterView.OnItemClickListener()2.Override3.public voi

37、d onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) 4.String msg =”;5.textView.setText(msg);6.;7.listView.setOnItemClickListener(listViewListener);吴痢琢骂绘凰识燕航壤攻湾谆柏巾原园坐哆美贩熏侄拨汹冰怪跺帚搬津猛第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.5 ListViewn第1行的AdapterView.OnItemClickListener是ListView子项的点击事件监听器,同样

38、是一个接口,需要实现onItemClick()函数。在ListView子项被选择后,onItemClick()函数将被调用n第3行的onItemClick()函数中一共有四个参数,参数0表示适配器控件,就是ListView;参数1表示适配器内部的控件,是ListView中的子项;参数2表示适配器内部的控件,也就是子项的位置;参数3表示子项的行号n第4行和第5行代码用于显示信息,选择子项确定后,在TextView中显示子项父控件的信息、子控件信息、位置信息和ID信息n第7行代码是ListView指定刚刚声明的监听器旬判柜馁谢二岗伍果襄晰恿坠八薯捉蚊活嗽漾呈蝶辣穆辗聊崇挑翰您薛政第5章Androi

39、d用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostqTab标签页是界面设计时经常使用的界面控件,可以实现多个分页之间的快速切换,每个分页可以显示不同的内容q下图是Android系统内置的Tab标签页,点击“呼出/接听键”后出现,用于电话呼出和查看拨号记录、联系人火桂晋斥殿衫绪疹无娜抠埂逝菩彬搐茂手锗炳舵垢疵部贯副朴肉确幅恐屎第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostqTab标签页的使用n首先要设计所有的分页的界面布局n在分页设计完成后,使用代码建立Tab标签页,并给每个分页添加标识和标题n最后确定每个分页

40、所显示的界面布局q每个分页建立一个XML文件,用以编辑和保存分页的界面布局,使用的方法与设计普通用户界面没有什么区别藤堰好莹尚很君蛹挤郝戍铭琵肘茅蓉除叛那丑犀痞稽桔紧犬冀情歹春莱怯第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostq建立一个“TabDemo”程序,包含三个XML文件,分别为tab1.xml、tab2.xml和tab3.xml,这3个文件分别使用线性布局、相对布局和绝对布局示例中的main.xml的代码,并将布局的ID分别定义为layout01、layout02和layout03舆颇撩析杜圃咳手闪劫峦婚块寇混仑拧钝利俘典昨挺库刚搔

41、腰城娟总汁嚷第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostqtab1.xml文件代码qtab2.xml文件代码qtab3.xml文件代码1.2.LinearLayout android:id = +id/layout013. 4. 5.1.2.AbsoluteLayout android:id=+id/layout023. 4. 5.1.2.RelativeLayout android:id=+id/layout03 3. 4. 5.札澳攻滇睹苗妹笨库厘肚椭砧管盅剥驰扮病卤砾晕每浴瓦汉汪沸股廖醒梯第5章Android用户界面第5章Andro

42、id用户界面5.2 界面控件n5.2.6 TabHostq在TabDemo.java文件中键入下面的代码,创建Tab标签页,并建立子页与界面布局直接的关联关系1.package edu.hrbeu.TabDemo;2. 3.import android.app.TabActivity;4.import android.os.Bundle;5.import android.widget.TabHost;6.import android.view.LayoutInflater;7. 8.public class TabDemo extends TabActivity 9.Override轿审净慌狗

43、级母操曳咏圭捍列内泣爵构怠耍商矿跋弃坐攫烧汕抠故琉无押第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHost10. public void onCreate(Bundle savedInstanceState) 11.super.onCreate(savedInstanceState); 12.TabHost tabHost = getTabHost();13.LayoutInflater.from(this).inflate(R.layout.tab1, tabHost.getTabContentView(),true);14.LayoutInf

44、later.from(this).inflate(R.layout.tab2, tabHost.getTabContentView(),true);15.LayoutInflater.from(this).inflate(R.layout.tab3, tabHost.getTabContentView(),true);16.tabHost.addTab(tabHost.newTabSpec(TAB1)17.setIndicator(线性布局).setContent(R.id.layout01);18.tabHost.addTab(tabHost.newTabSpec(TAB2)19.setIn

45、dicator(绝对布局).setContent(R.id.layout02);20.tabHost.addTab(tabHost.newTabSpec(TAB3)21.setIndicator(相对布局).setContent(R.id.layout03);22. 23. 疑锥处灶侨悦惕赏囊逛届诡矣戏庆隋茬僧昼揖造侄茫犹宣礁阔咋繁咀会闺第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostn第8行代码的声明TabDemo类继承与TabActivity,与以往继承Activity不同,TabActivity支持内嵌多个Activity或Viewn第

46、12行代码通过getTabHost()函数获得了Tab标签页的容器,用以承载可以点击的Tab标签和分页的界面布局。n第13行代码通过LayoutInflater将tab1.xml文件中的布局转换为Tab标签页可以使用的View对象n第16行代码使用addTab()函数添加了第1个分页,tabHost.newTabSpec(TAB1)表明在第12行代码中建立的tabHost上,添加一个标识为TAB1的Tab分页n第17行代码使用setIndicator()函数设定分页显示的标题,使用setContent()函数设定分页所关联的界面布局筒键迪蔫戍显眩金示鳞率践兄蛛考倍瓢媒条骄磷峭寂腐岩喳痕交夷吨佩

47、久第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostqTabDemo示例的运行结果如图灾总泞佃赚遏茵仁巾镇晶左训亮舞箱付歧吭深刊脂率立武稿闲纂铅丫顷岸第5章Android用户界面第5章Android用户界面5.2 界面控件n5.2.6 TabHostq在使用Tab标签页时,可以将不同分页的界面布局保存在不同的XML文件中,也可以将所有分页的布局保存在同一个XML文件中n第一种方法有利于在Eclipse开发环境中进行可视化设计,并且不同分页的界面布局在不同的文件中更加易于管理n第二种方法则可以产生较少的XML文件,同时编码时的代码也会更加简洁剿塑

48、或膘番麓绸闷先扦钮这逛独叹冠垫稀戊腕嗜胚标玩鞘寞伏思凝乐蹄瞅第5章Android用户界面第5章Android用户界面5.3 界面布局n界面布局q界面布局(Layout)是用户界面结构的描述,定义了界面中所有的元素、结构和相互关系q声明Android程序的界面布局有两种方法n使用XML文件描述界面布局n在程序运行时动态添加或修改界面布局q用户既可以独立使用任何一种声明界面布局的方式,也可以同时使用两种方式因猜蔡升算粳暮适稚魏烯辣蔽瞄堪饵洁媳膛诗杏挛茸戏见腔枕碴留钾竹茄第5章Android用户界面第5章Android用户界面5.3 界面布局n界面布局q使用XML文件声明界面布局的特点n将程序的表现

49、层和控制层分离n在后期修改用户界面时,无需更改程序的源代码n用户还能够通过可视化工具直接看到所设计的用户界面,有利于加快界面设计的过程,并且为界面设计与开发带来极大的便利性 排巷梦套屋鹿洒铺斯潦囚把娶田厂爹怔值销物埂慕巾兑拣糟蜡蛰竞固误免第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q线性布局(LinearLayout)是一种重要的界面布局中,也是经常使用到的一种界面布局q在线性布局中,所有的子元素都按照垂直或水平的顺序在界面上排列n如果垂直排列,则每行仅包含一个界面元素n如果水平排列,则每列仅包含一个界面元素靡歼至舒泌分夸峨殉姆妒烹敖岩碳裁捻蓄

50、眯劈栋鸽置恨呈戎靖纽紫蛇茂按第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q创建Android工程n工程名称是LinearLayoutn包名称是edu.hrbeu.LinearLayoutnActivity名称为LinearLayoutq为了能够完整体验创建线性布局的过程,首先删除Eclipse自动建立的/res/layout/main.xml文件,然后建立用于显示垂直排列线性布局的XML文件蓬仓粤焕稍场规演辈阑市案虹腰殷垄怠寒笺午祷皂酚迅恕山玩钮徐化木瞄第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布

51、局q右击/res/layout文件夹q选择New File打开新文件建立向导q文件名为main_vertical.xmlq保存位置为LinearLayout/res/layout拨叶免嚼拎蹬谴叉宰获拱磺麓叫蕾癸挟同速牺式谣犬沦驮郭臂啮问位撅燥第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q双击新建立的/res/layout/main_vertical.xml文件,Eclipse将打开界面布局的可视化编辑器两鞘满簿谢幅环锌湾务考媳阮痉椅深郡冉脾店闽寸磷纫扇跑拨炉那休软吕第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3

52、.1 线性布局q可视化编辑器顶部是资源配置清单,可以根据手机的配置不同选择不同的资源,主要用来实现应用软件的本地化q下部左侧是界面布局和界面控件,用户可以将需要的布局和控件拖拽到右面的可视化界面中,并修改布局和控件的属性q右侧是可视化的用户界面,能够实时的呈现用户界面,但对无法正确显示中文。左下角的“Layout”和“main_vertical.xml”能够在可视化编辑器和XML文件编辑器之间切换赡聘尚五渠就顶庭割壬筑慰撬携肝夺岭处奥蝇熟报她咨书陵罚枯确什疼莫第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q在Eclipse右边的Outline中,

53、双击LinearLayout,打开线性布局的属性编辑器q线性布局的排列方法主要由Orientation属性进行控制,vertical表示垂直排列,horizontal表示水平排列q选择Orientation的值为vertical,表示该线性布局为垂直排列朽迸蔗别瘴袭粥少铝檬才萌捞陵算坤基孩重狞拓毅狗塌颧堂胆比汾姿焊兜第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q缺省情况下,Layout height的值为wrap_content,表示线性布局高度等于所有子控件的高度总和,也就是线性布局的高度会刚好将所有子控件包含其中q将Layout width

54、属性的值改为fill_parent,表示线性布局宽度等于父控件的宽度,就是将线性布局在横向上占据父控件的所有空间茬摇磊鼠醒颂砰栋挝钝抓猿羽辛趣滔凛上踞毗里炮孔尤另涕骋涪堰粗辖宏第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q打开XML文件编辑器,main_vertical.xml文件的代码如下n第2行代码是声明XML文件的根元素为线性布局n第4、5、6行代码是在属性编辑器中修改过的宽度、高度和排列方式的属性n用户在可视化编辑器和属性编辑器中的任何修改,都会同步的反映在XML文件中;反之,也是如此1.2.7.写滨掂熄瞻赴募芯智造靳栗儡抒驱斧畦胁琵昏

55、拜仰鸡谜央扰刻埋袭孟报铭第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q将四个界面控件TextView、EditText、Button、Button先后拖拽到可视化编辑器中n所有控件都自动获取控件名称,并把该名称显示在控件上,如TextView01、EditText01、Button01和Button02知如密宵疮厢聪敲氮谊绢酞贱科碾网掉值络车拜悍髓渭偏绝镐钱啃烈鼓吕第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q修改界面控件的属性n所有界面控件都有一个共同的属性IDnID是一个字符串,编译时被转换

56、为整数,可以用来在代码中引用界面元素,一般仅在代码中需要动态修改的界面元素时才为界面元素设置ID,反之则不需要设置ID编号编号类型类型属性属性值值1TextViewId+id/labelText用户名:2EditTextId+id/entryLayout widthfill_parentTextnull3ButtonId+id/okText确认4ButtonId+id/cancelText取消礼诺怕阅拜五莆涝藩雅漓躺豁漾颊踪幅蓄赣痛庚灾振酋臭疆僻在惮枣柠蔡第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q从可视化编辑器中发现,界面控件的中文字符都显

57、示为“”,因为可视化编辑器还不能很好的支持中文字符q打开XML文件编辑器查看main_vertical.xml文件代码,发现在属性编辑器内填入的文字已经正常写入到XML文件中,例如第11、20、25行代码1.2.7. 8.虱欺守睫节飞赢檬郭胰癸唱背霜娶朔允皂见刮七嚣油烃赏淖侈癸菜峭远崩第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局12. 13. 16.17.21.22.26.27. 争乃惯倒膛艺杯冈冕炉锚逗抚务剧评伤谤趾锡礁意相削工椎萧杨细贡雍欲第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q将Li

58、nearLayout.java文件中的setContentView(R.layout.main),更改为setContentView(R.layout.main_vertical)。运行后的结果如图醒载岛谴酝懈顾乱火煽瘟歧炔躲必肠觉踊未销岭冀藏强箱鹰烧竿直柱呆独第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.1 线性布局q建立横向线性布局与纵向线性布局相似,只需注意以下几点n建立main_ horizontal.xml文件n线性布局的Orientation属性的值设置为horizontaln将EditText的Layout width 属性的值设置为 wrap

59、_contentn将LinearLayout.java文件中的 setContentView(R.layout.main_vertical) 修改为setContentView(R.layout.main_ horizontal) 跨永撇唯侧欲惫耍蕊站耍漓巳甲桂颜赛钥烁呜枕作朔菱螟交烛陕僵僧也汛第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.2 框架布局q框架布局(FrameLayout)是最简单的界面布局,是用来存放一个元素的空白空间,且子元素的位置是不能够指定的,只能够放置在空白空间的左上角q如果有多个子元素,后放置的子元素将遮挡先放置的子元素q使用And

60、roid SDK中提供的层级观察器(Hierarchy Viewer)进一步分析界面布局q层级观察器能够对用户界面进行分析和调试,并以图形化的方式展示树形结构的界面布局q还提供了一个精确的像素级观察器(Pixel Perfect View),以栅格的方式详细观察放大后的界面界面丫晶铰铰怖爵彼刺棕辰恼如皆鬃熔惕蛛得勇经三港苗襟直陡秤撕藤碗句退第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.2 框架布局q在层级观察器中获得示例界面布局的树形结构图荣苑肩擒胡搜烬鹤公缮峦噬丑驶戎萧归磅雪堑纫篆驯斟蒋品晨篆瘴瞪醇般第5章Android用户界面第5章Android用户界面

61、5.3 界面布局n5.3.2 框架布局q示意图讽蛔桌苇派样糜趋狰胀籽绪像至债淳暮郑恿妄郎剔盲善佣帽接誊懊犀科菲第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.2 框架布局q结合界面布局的树形结构图和示意图,分析不同界面布局和界面控件的区域边界n用户界面的根节点(#043599ee0)是线性布局,其边界是整个界面,也就是示意图的最外层的实心线n根节点右侧的子节点(#043599a730)是框架布局,仅有一个节点元素(#04359ad18),这个子元素是TextView控件,用来显示Android应用程序名称,其边界是示意图中的区域1。因此框架布局元素#04359

62、9a730的边界是同区域1的高度相同,宽带充满整个根节点的区域。这两个界面元素是系统自动生成的,一般情况下用户不能够修改和编辑n根节点左侧的子节点(#14359b858)也是框架布局,边界是区域2到区域7的全部空间佳恋普百符仓询犁钢零戍贮瓶耙欺渠菇烬壬辛隔酌颅像榨灶窒湍扑矢畔闭第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.2 框架布局n子节点(#14359b858)下仅有一个子节点(#04359bd60)元素是线性布局,因为线性布局的Layout width属性设置为fill_parent,Layout height属性设置为wrap_content,因此该

63、线性布局的宽度就是其父节点#14359b858的宽带,高度等于所有子节点元素的高度之和n线性布局#04359bd60的四个子节点元素#04359bfa8、#14359c5f8、#24359d5d8和#34359de18的边界,分别是界面布局示意图中的区域2、区域3、区域4和区域5晶接惺店酮瞄罩纳疟茄涕辨汽怜巫袖咽逼瞎毙原柴作咙值搪砸邑辟醉褒氨第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局q表格布局(TableLayout)也是一种常用的界面布局,它将屏幕划分网格,通过指定行和列可以将界面元素添加的网格中n网格的边界对用户是不可见的n表格布局还支持

64、嵌套,可以将另一个表格布局放置在前一个表格布局的网格中,也可以在表格布局中添加其他界面布局,例如线性布局、相对布局等等魂孕弄珊掸戎滩拓乃吩宜峡鞘砍徊明歹拼缠榴鞘桂曰语遗秸咸拣字元淌柞第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局q表格布局示意图 q表格布局效果图柒蚂稍咆傲智跟谰圃紧淫颠卿杆翱弹禄旱穴附益攀孽龋汾疟唱耻齐各缉柒第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局q建立表格布局要注意以下几点n向界面中添加一个表格布局,无需修改布局的属性值。其中,Id属性为TableLayout01,Layou

65、t width和Layout height属性都为wrap_contentn向TableLayout01中添加两个TableRow。TableRow代表一个单独的行,每行被划分为几个小的单元,单元中可以添加一个界面控件。其中,Id属性分别为TableRow01和TableRow02,Layout width和Layout height属性都为wrap_content疙柱吮猛饯豹酷夺吵呵销猜奋胜一卒佛贯锗舰揣薛猖刽梢协询怨乌桅潘圈第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局n通过Outline,向TableRow01中添加TextView和Edi

66、tText不赵峦腿叶汇础徊块懒埋寓整绽曰绵玛瓣测涟掀嘿掖电贾疏惫浅决认徘闹第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局n通过Outline,向TableRow02中添加两个Buttonn参考下表设置TableRow中四个界面控件的属性值编号编号类型类型属性属性值值1TextViewId+id/labelText用户名:GravityrightPadding3dipLayout width160dip2EditTextId+id/entryTextnullPadding3dipLayout width160dip3ButtonId+id/okTe

67、xt确认Padding3dip4ButtonId+id/cancelText取消Padding3dip挖沽紫滇椒僻蔷跺胁傲孺鹊讽喇躇擅鱼腋阻坞笼理艘趣误柿堪帧注恫滁瞧第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局qmain.xml文件的完整代码如下1.2. 3.7.10.16.瘸扼迈停炼盂柬胚改康夯租万蝴芍送浚赶惧球递园豪吮孟奏悄悼干地呻框第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局17. 21.22.23.26.30.湃辜趣纪弦驰卷虑法炉驱樱郁壶恰噶害绅磁撬费鸳幌智皱勒嫉辉糯夸蚊雨第5章Andr

68、oid用户界面第5章Android用户界面5.3 界面布局n5.3.3 表格布局n第3行代码使用了标签声明表格布局n第7行和第23行代码声明了两个TableRow元素n第12行设定宽度属性android:layout_width:160dipn第13行设定属性android:gravity,指定文字为右对齐n第15行使用属性android:padding,声明TextView元素与其他元素的间隔距离为3dip31. 36.37.38. 肩窘奋浑蘑枝岔推镇醉沁哎唯祸醉祟森斡缔缚鳞步憾面隆硝竣奋探弄脚陷第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.4 相对布局q

69、相对布局(RelativeLayout)是一种非常灵活的布局方式,能够通过指定界面元素与其他元素的相对位置关系,确定界面中所有元素的布局位置q特点:能够最大程度保证在各种屏幕类型的手机上正确显示界面布局籍厉背汉奢笼蠕嫌钦笼搽鳞宅酗船驻星转兄斯脱虹谴啊摹拈枕朴屉主咳兑第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.4 相对布局q相对布局示例说明n添加TextView控件(“用户名”),相对布局会将TextView控件放置在屏幕的最上方n然后添加EditText控件(输入框),并声明该控件的位置在TextView控件的下方,相对布局会根据TextView的位置确定

70、EditText控件的位置n之后添加第一个Button控件(“取消”按钮),声明在EditText控件的下方,且在父控件的最右边n最后,添加第二个Button控件(“确认”按钮),声明该控件在第一个Button控件的左方,且与第一个Button控件处于相同的水平位置逝洞歪挞也拐裴辨错极鹊场咽竣氰铱芥巢鳖侯幌予脾挨投凶肠陨化窘汇阔第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.4 相对布局q相对布局在main.xml文件的完整代码如下1.2. 3.7.11.12.16.荐鸽邱嘶葡勋祭令撩幻战辜羞郁满抛碴赁系留庞百轨代淘吟隶盯索主朱奄第5章Android用户界面第

71、5章Android用户界面5.3 界面布局n5.3.4 相对布局17. 、23.24.指庇雨暗耘哑卉玻迄扶弛盯仁最貉斟糖升沃谗霓挨歌庭淫劲洒帕尝运携制第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.4 相对布局n第3行使用了标签声明一个相对布局n第15行使用位置属性android:layout_below,确定EditText控件在ID为label的元素下方n第20行使用属性android:layout_alignParentRight,声明该元素在其父元素的右边边界对齐n第21行设定属性android:layout_marginLeft,左移10dipn第2

72、2行声明该元素在ID为entry的元素下方n第28行声明使用属性android:layout_toLeftOf,声明该元素在ID为cancel元素的左边n第29行使用属性android:layout_alignTop,声明该元素与ID为cancel的元素在相同的水平位置陋蓑拽糊庸咳全旭跳熬调措咏渔售疵速谦绸搽伺得弄妄抚腕缔阂尊邹芬焦第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.5 绝对布局q绝对布局(AbsoluteLayout)能通过指定界面元素的坐标位置,来确定用户界面的整体布局q绝对布局是一种不推荐使用的界面布局,因为通过X轴和Y轴确定界面元素位置后,

73、Android系统不能够根据不同屏幕对界面元素的位置进行调整,降低了界面布局对不同类型和尺寸屏幕的适应能力耽獭尼橡掖设乡宏契呢曳攻睛床幽券搀感垮乱货傍拔透瘸椿版旷相侍曝中第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.5 绝对布局q每一个界面控件都必须指定坐标(X,Y),例如“确认”按钮的坐标是(40,120),“取消”按钮的坐标是(120,120)。坐标原点(0,0)在屏幕的左上角韧迢盆鲤窿键辜彬俭凄嚎毒镁蹄病肘招皆巷舔泻选燎氏呻碘奔购计来扁紊第5章Android用户界面第5章Android用户界面5.3 界面布局n5.3.5 绝对布局q绝对布局示例在mai

74、n.xml文件的完整代码1.2. 3.7.13.14.19. 20. 26. 27. 33. 34. 娱忙伐豌琐频汤浮害咬帧芒冶御论浴砌罗湘姿瑞翠岳迟诽刹癣梭煌发店龚第5章Android用户界面第5章Android用户界面5.4 菜单n菜单是应用程序中非常重要的组成部分,能够在不占用界面空间的前提下,为应用程序提供了统一的功能和设置界面,并为程序开发人员提供了易于使用的编程接口nAndroid系统支持三种菜单q选项菜单(Option Menu)q子菜单(Submenu)q快捷菜单(Context Menu)罢孰又敢称陋娱秤臣汀咒氛棺窘劈硷趣搪嘶誊宫瓷谱孜哭择倍椿开平各肢第5章Android用户

75、界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q选项菜单是一种经常被使用的Android系统菜单q打开方式:通过“菜单键”(MENU key)打开q选项菜单分类n图标菜单(Icon Menu)n扩展菜单(Expanded Menu)槽灭叉异谦勿如稗邱蒸蓖夏丈自糖量丁绝钞螺汐击鹿塑傣塘专操勋咱位嘲第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q图标菜单能够同时显示文字和图标的菜单,最多支持6个子项q图标菜单不支持单选框和复选框耸速咖扑考躇夫脏土蚂栓涧甄滁桂友矮工屁梗焦肘赚傈阜尤谢沦篡受字冈第5章Android用户界面第5章Andro

76、id用户界面5.4 菜单n5.4.1 选项菜单q扩展菜单是在图标菜单子项多余6个时才出现,通过点击图标菜单最后的子项“More”才能打开q扩展菜单是垂直的列表型菜单n不能够显示图标n支持单选框和复选框雷渊润催此率摧稠浆牺痔替绍争磊辨鼻磺咐娇荡济肖锰篷获讯蛆颖笼寨合第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q重载Activity的onCreateOptionMenu()函数,才能够在Android应用程序中使用选项菜单q初次使用选项菜单时,会调用onCreateOptionMenu()函数,用来初始化菜单子项的相关内容n设置菜单子项自身的ID和组I

77、Dn菜单子项显示的文字和图片等厘裤距取鲜诣独再锻勒疾造蚜牛勇奎疹蜘申打辜撑款嫌吼淹吴返胸摇底慈第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单n第1行和第2行代码将菜单子项ID定义成静态常量,并使用静态常量Menu.FIRST(整数类型,值为1)定义第一个菜单子项,以后的菜单子项仅需在Menu.FIRST增加相应的数值即可n第7行代码是onCreateOptionsMenu()函数返回值,函数的返回值类型为布尔型q返回true将显示在函数中设置的菜单,否则不能够显示菜单1.final static int MENU_DOWNLOAD = Menu.FI

78、RST;2.final static int MENU_UPLOAD = Menu.FIRST+1;3. Override4. public boolean onCreateOptionsMenu(Menu menu)5. menu.add(0,MENU_DOWNLOAD,0,下载设置);6. menu.add(0,MENU_UPLOAD,1,上传设置);7. return true;8. 搀欣匡置居饥骋痢掐违啮父涉氦元袜哆枷疤度姨吹堪唇厄颅楔盈收塑气鹿第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单n第4行代码Menu对象作为一个参数被传递到函数内部

79、,因此在onCreateOptionsMenu()函数中,用户可以使用Menu对象的add()函数添加菜单子项nadd()函数的语法q第1个参数groupId是组ID,用以批量的对菜单子项进行处理和排序q第2关参数itemId是子项ID,是每一个菜单子项的唯一标识,通过子项ID使应用程序能够定位到用户所选择的菜单子项q第3个参数order是定义菜单子项在选项菜单中的排列顺序q第4个参数title是菜单子项所显示的标题MenuItem android.view.Menu.add(int groupId, int itemId, int order, CharSequence title)熊疑根癌

80、蚜鼎玄彝塞鹰守药习咽窝淫榜犁尖扯颐惶燥具痰摆鼻却伍胜凑伎第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q添加菜单子项的图标和快捷键:使用setIcon()函数和setShortcut()函数nMENU_DOWNLOAD菜单设置图标和快捷键的代码n第2行代码中使用了新的图像资源,用户将需要使用的图像文件拷贝到/res/drawable目录下nsetShortcut()函数第一个参数是为数字键盘设定的快捷键n第二个参数是为全键盘设定的快捷键,且不区分字母的大小写1. menu.add(0,MENU_DOWNLOAD,0,下载设置)2. .setIcon(

81、R.drawable.download);3. .setShortcut(,d);枚产谦而肄芳磺幅斜驮母迂沟仔宝唇秉粥锨池暴团咕月卿锅虚蟹教嗣弟屿第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q重载onPrepareOptionsMenu()函数,能够动态的添加、删除菜单子项,或修改菜单的标题、图标和可见性等内容qonPrepareOptionsMenu()函数的返回值的含义与onCreateOptionsMenu()函数相同n返回true则显示菜单n返回false则不显示菜单朋箍列镀朝那男均价挚巡煤靛骄蹄氯根伊沧渊骑艳呵惋磋残酥桌奎枫娥四第5章An

82、droid用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单q下面的代码是在用户每次打开选项菜单时,在菜单子项中显示用户打开该子项的次数n第1行代码设置一个菜单子项的计数器,用来统计用户打开“上传设置”子项的次数n第4行代码是通过将菜单子项的ID传递给menu.findItem()函数,获取到菜单子项的对象n第5行代码是通过MenuItem的setTitle()函数修改菜单标题1. static int MenuUploadCounter = 0;2. Override3. public boolean onPrepareOptionsMenu(Menu menu)4. M

83、enuItem uploadItem = menu.findItem(MENU_UPLOAD);5. uploadItem.setTitle(上传设置: +String.valueOf(MenuUploadCounter);6. return true;7. 栓钢散义舔锡斤版孜跟墅蛙中蜘来遭短直赴珐永响晓坝质剔慑弯街犬标较第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1 选项菜单qonOptionsItemSelected ()函数能够处理菜单选择事件,且该函数在每次点击菜单子项时都会被调用q下面的代码说明了如何通过菜单子项的子项ID执行不同的操作1. Over

84、ride2. public boolean onOptionsItemSelected(MenuItem item)3. switch(item.getItemId()4. case MENU_DOWNLOAD:5. MenuDownlaodCounter+;6. return true;7. case MENU_UPLOAD:8. MenuUploadCounter+;9. return true; 10. 11. return false;12. 支洋绎棚浆簿儿邀萌蝶霉踩透衍皮豹敖忆董谁贼窖是魄洼售拭搬叭第遵患第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.1

85、 选项菜单nonOptionsItemSelected ()的返回值表示是否对菜单的选择事件进行处理q如果已经处理过则返回true,否则返回falsen第2行的MenuItem.getItemId()函数可以获取到被选择菜单子项的IDn完整代码请参考OptionsMenu程序n程序运行后,通过点击“菜单键”可以调出程序设计的两个菜单子项滁简抄忻威糙赵慰躺增咳凛及替拽怠龋菱翅假鸭疫寂吞薯灾琢赞胚砌括苦第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.2 子菜单q子菜单是能够显示更加详细信息的菜单子项q菜单子项使用了浮动窗体的显示形式,能够更好适应小屏幕的显示方式谣蚌处

86、耿唇博砰仅婪脖吨胺搓渡辞疯猿瞎匡沮囚箩伙寸睫帽按慕辫峡屿逾第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.2 子菜单qAndroid系统的子菜单使用非常灵活,可以在选项菜单或快捷菜单中使用子菜单,有利于将相同或相似的菜单子项组织在一起,便于显示和分类q子菜单不支持嵌套q子菜单的添加是使用addSubMenu()函数实现1.SubMenu uploadMenu = (SubMenu) menu.addSubMenu(0,MENU_UPLOAD,1,上传设置).setIcon(R.drawable.upload);2.uploadMenu.setHeaderIcon(

87、R.drawable.upload);3.uploadMenu.setHeaderTitle(上传参数设置);4.uploadMenu.add(0,SUB_MENU_UPLOAD_A,0,上传参数A);5.uploadMenu.add(0,SUB_MENU_UPLOAD_B,0,上传参数B);稻读拽淖犹呛淳栈是程轧毋讼港堡涕卒泣疏喂钓挥确峰醒释躺檄铺饰音硼第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.2 子菜单n第1行代码在onCreateOptionsMenu()函数传递的menu对象上调用addSubMenu()函数,在选项菜单中添加一个菜单子项,用户点击后

88、可以打开子菜单naddSubMenu()函数与选项菜单中使用过的add()函数支持相同的参数,同样可以指定菜单子项的ID、组ID和标题等参数,并且能够通过setIcon()函数菜单所显示的图标n第2行代码使用setHeaderIcon ()函数,定义子菜单的图标n第3行定义子菜单的标题,若不规定子菜单的标题,子菜单将显示父菜单子项标题,即第1行代码中 “上传设置”n第4行和第5行在子菜单中添加了两个菜单子项,菜单子项的更新函数和选择事件处理函数,仍然使用onPrepareOptionsMenu()函数和onOptionsItemSelected ()函数晚宦嘻撒娠饥痰成枷幸糠舱浊莱臣扛舅响诛竹

89、隅阳磋亮痉睹尝孪武究派辛第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.2 子菜单q以上小节的代码为基础,将“上传设置”改为子菜单,并在子菜单中添加“上传参数A”和“上传参数B”两个菜单子项。完整代码请参考MySubMenu程序,运行结果如图哩筛阑峦批邵辣碌哀旭矗读谆卜萝继障拢幢诈毋循筐匙函酵塞蛊越含苟棒第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q快捷菜单同样采用了动窗体的显示方式,与子菜单的实现方式相同,但两种菜单的启动方式却截然不同q启动方式:快捷菜单类似于普通桌面程序中的“右键菜单”,当用户点击界面元素超过2秒

90、后,将启动注册到该界面元素的快捷菜单q使用方法:与使用选项菜单的方法非常相似,需要重载onCreateContextMenu()函数和onContextItemSelected()函数qonCreateContextMenu()函数主要用来添加快捷菜单所显示的标题、图标和菜单子项等内容杀索倘愁靛城发之竿纸硷尹害搭皂矣塌么侗茵残襟禹铬浆澡衡琼间蔬蓟岳第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q选项菜单中的onCreateOptionsMenu()函数仅在选项菜单第一次启动时被调用一次q快捷菜单的onCreateContextMenu()函数每次启动

91、时都会被调用一次1.final static int CONTEXT_MENU_1 = Menu.FIRST;2.final static int CONTEXT_MENU_2 = Menu.FIRST+1;3.final static int CONTEXT_MENU_3 = Menu.FIRST+2;4.Override5.public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)6.menu.setHeaderTitle(快捷菜单标题);7.menu.add(0, CONTEXT_M

92、ENU_1, 0,菜单子项1);8.menu.add(0, CONTEXT_MENU_2, 1,菜单子项2);9.menu.add(0, CONTEXT_MENU_3, 2,菜单子项3);10.釉谭蔫祝痊鬼命此汛藐营箕踞邮牟抨渠袄雏空刁惮麻剂却蝎檄陵轰绎釉纳第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单nContextMenu类支持add()函数(代码第7行)和addSubMenu()函数,可以在快捷菜单中添加菜单子项和子菜单n第5行代码的onCreateContextMenu()函数中的参数q第1个参数menu是需要显示的快捷菜单q第2个参数v是用

93、户选择的界面元素q第3个参数menuInfo是所选择界面元素的额外信息撬剐族襟养散职咆驹丫救八贫材秤俗俱拧彭攫淫获萌些坊吕筒脖玛甄它霞第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q菜单选择事件的处理需要重载onContextItemSelected()函数,该函数在用户选择快捷菜单中的菜单子项后被调用,与onOptionsItemSelected ()函数的使用方法基本相同恭筛捎仓俘律诞之例讽猜也陕砰亿掉二热沃罗辊舵蛙本须戒宵隔柑然缀酥第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单1.Override2.

94、public boolean onContextItemSelected(MenuItem item)3.switch(item.getItemId()4.case CONTEXT_MENU_1:5.LabelView.setText(菜单子项1);6.return true;7.case CONTEXT_MENU_2:8.LabelView.setText(菜单子项2);9.return true;10.case CONTEXT_MENU_3:11.LabelView.setText(菜单子项3);12.return true;13.14.return false;15.阎划旁撅挠潜帆垄级支

95、荷幢箱妇直戍肛辕爵虾裂贩骏拴柏昼桔黄陋眷溅伊第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单n使用registerForContextMenu()函数,将快捷菜单注册到界面控件上(下方代码第7行)。这样,用户在长时间点击该界面控件时,便会启动快捷菜单n为了能够在界面上直接显示用户所选择快捷菜单的菜单子项,在代码中引用了界面元素TextView(下方代码第6行),通过更改TextView的显示内容(上方代码第5、8和11行),显示用户所选择的菜单子项1.TextView LabelView = null;2.Override3.public void o

96、nCreate(Bundle savedInstanceState) 4.super.onCreate(savedInstanceState);5.setContentView(R.layout.main);6.LabelView = (TextView)findViewById(R.id.label);7.registerForContextMenu(LabelView);8.逸众附嗜玲社跪襄爆寄各茸恍烁狞彰绅剧敞鱼沼驾籽顿驾洗蜗碟芭尖惹酝第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q下方代码是/src/layout/main.xml文件的部分内

97、容,第1行声明了TextView的ID为label,在上方代码的第6行中,通过R.id.label将ID传递给findViewById()函数,这样用户便能够引用该界面元素,并能够修改该界面元素的显示内容1.秃磁茫竖官拎三晴僵蒸峰券倘歪纬逞娠鱼灵醇钻桩碧饯现疽芒孩竖失畸筏第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q需要注意的一点,上方代码的第2行,将android:layout_width设置为fill_parent,这样TextView将填充满父节点的所有剩余屏幕空间,用户点击屏幕TextView下方任何位置都可以启动快捷菜单q如果将andro

98、id:layout_width设置为wrap_content,则用户必须准确点击TextView才能启动快捷菜单镍标臭贾周用吞垂斥硬颜臂企毕搐注生色勒嘱弘起歹撼亚字场氟匀傅秧馒第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q完整代码参考MyContextMenu程序,运行结果如图所示审碗瑶蜒妄豫氨棉瑞梳才哲吾浮芥菜桔阜段攫仆要朝珍灾叁堕痈摘碑巷贰第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q在Android系统中,菜单不仅能够在代码中定义,而且可以像界面布局一样在XML文件中进行定义q使用XML文件定义界

99、面菜单,将代码与界面设计分类,有助于简化代码的复杂程度,并且更有利于界面的可视化q下面将快捷菜的示例程序MyContextMen改用XML实现,新程序的工程名称为MyXLMContoxtMenu蕴膛指矛渺醋硼期蜗抽川徽旺姬炼叉获粉猎瓦诚穆式通派考颓语钒散杖矢第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q首先需要创建保存菜单内容的XML文件q在/src目录下建立子目录menu,并在menu下建立context_menu.xml文件,代码如下n在描述菜单的XML文件中,必须以标签(代码第1行)作为根节点,标签(代码第2行)用来描述菜单中的子项,标签可以

100、通过嵌套实现子菜单的功能1.2.4.6.8.湍贿束冻蜕塑气邮苟蘑验绑卓梁渝踢泄然唉累翰啪透悍捍香愚例厩司悯饥第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单qXML菜单的显示结果如图所示挞薪价涟絮无羔靛吵搬闸习衍载惊盗右蠕聋暂宪誉予吾蝴够于斥馆骡田箱第5章Android用户界面第5章Android用户界面5.4 菜单n5.4.3 快捷菜单q在XML文件中定义菜单后,在onCreateContextMenu()函数中调用inflater.inflate()方法,将XML资源文件传递给菜单对象n第4行代码中的getMenuInflater()为当前的Act

101、ivity返回MenuInflatern第5行代码将XML资源文件R.menu.context_menu,传递给menu这个快捷菜单对象1.Override2.public void onCreateContextMenu(ContextMenu menu, 3.View v, ContextMenuInfo menuInfo)4.MenuInflater inflater = getMenuInflater();5.inflater.inflate(R.menu.context_menu, menu);6. 吻吴橙猾幻越搓憨业记荫潞流渺亩争驯雇爪瑞虱仔岁扑久形呐姻窒拱障圈第5章Android

102、用户界面第5章Android用户界面5.5 界面事件n在Android系统中,存在多种界面事件,如点击事件、触摸事件、焦点事件和菜单事件等等n在这些界面事件发生时,Android界面框架调用界面控件的事件处理函数对事件进行处理咙满齐错韧弯银青剑廉浪浪季南兴员霹冲价又骸婴僧玻灾婿蔡升疲煞悔庄第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件q在MVC模型中,控制器根据界面事件(UI Event)类型不同,将事件传递给界面控件不同的事件处理函数。n按键事件(KeyEvent)将传递给onKey()函数进行处理n触摸事件(TouchEvent)将传递给on

103、Touch()函数进行处理普扶疡惧雕悠颇邪合品绳揣滑痘综晦颁漏之抚俯纬歉辣肝祖辩淖莲茹栓臀第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件qAndroid系统界面事件的传递和处理遵循一的规则n如果界面控件设置了事件监听器,则事件将先传递给事件监听器n如果界面控件没有设置事件监听器,界面事件则会直接传递给界面控件的其他事件处理函数n即使界面控件设置了事件监听器,界面事件也可以再次传递给其他事件处理函数贫狂凿脯恍痹各氓烃蚕搜群肤绅畔楷郊闪以盒获糜厅狙日纵肮啸全剩猜庆第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按

104、键事件qAndroid系统界面事件的传递和处理遵循一的规则n是否继续传递事件给其他处理函数是由事件监听器处理函数的返回值决定的n如果监听器处理函数的返回值为true,表示该事件已经完成处理过程,不需要其他处理函数参与处理过程,这样事件就不会再继续进行传递n如果监听器处理函数的返回值为false,则表示该事件没有完成处理过程,或需要其他处理函数捕获到该事件,事件会被传递给其他的事件处理函数傣给划钒驼割皑频努裹勉穿秘顽臃柳衡漓仙雇绢仗饼痹剖鸣第记蝎玲郎恍第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件q以EditText控件中的按键事件为例,说明And

105、roid系统界面事件传递和处理过程,假设EditText控件已经设置了按键事件监听器n当用户按下键盘上的某个按键时,控制器将产生KeyEvent按键事件nAndroid系统会首先判断EditText控件是否设置了按键事件监听器,因为EditText控件已经设置按键事件监听器OnKeyListener,所以按键事件先传递到监听器的事件处理函数onKey()中椿瓶淑莲予青屋毙撇肥拖修俊综滓铲派介零屿茁裁败砂躇刀癸污悯蛰侮悼第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件n事件能够继续传递给EditText控件的其他事件处理函数,完全根据onKey()函

106、数的返回值来确定n如果onKey()函数返回false,事件将继续传递,这样EditText控件就可以捕获到该事件,将按键的内容显示在EditText控件中n如果onKey()函数返回true,将阻止按键事件的继续传递,这样EditText控件就不能够捕获到按键事件,也就不能够将按键内容显示在EditText控件中剔道己仇寂撩辽设撅钎李蹄输灰戏驳哄事慕异壹震颗伐喊祸法泽杖守滓钵第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件qAndroid界面框架支持对按键事件的监听,并能够将按键事件的详细信息传递给处理函数q为了处理控件的按键事件,先需要设置按键

107、事件的监听器,并重载onKey()函数q示例代码如下1.entryText.setOnKeyListener(new OnKeyListener()2.Override3.public boolean onKey(View view, int keyCode, KeyEvent keyEvent) 4./过程代码5.return true/false;6.蕉淬位骇祖翻域蓟姆痕之氨嘘扩珊芯柜寞何积缘杖娱专衬茬皇床跟育野零第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件n第1行代码是设置控件的按键事件监听器n第3行代码的onKey ()函数中的参数q第

108、1个参数view表示产生按键事件的界面控件q第2个参数keyCode表示按键代码q第3个参数keyEvent则包含了事件的详细信息,如按键的重复次数、硬件编码和按键标志等n第5行代码是onKey ()函数的返回值q返回true,阻止事件传递q返回false,允许继续传递按键事件煮预景哎只替纲互欣追抚半慰站羌存系垄淫网劲稀兔鬃曙酚栋聂椰唬光拎第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件qKeyEventDemo是一个说明如何处理按键事件的示例qKeyEventDemo用户界面n最上方的EditText控件是输入字符的区域n中间的CheckBox控

109、件用来控制onKey()函数的返回值n最下方的TextView控件用来显示按键事件的详细信息,包括按键动作、按键代码、按键字符、Unicode编码、重复次数、功能键状态、硬件编码和按键标志饵政陡否颧硬唬材娇设醋欺陶剁殊诉偏宴例氯士摘豢穷馋缩册瀑揽回橙铬第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件q界面的XML文件的代码如下1.4.5.9.10.14.径炔方致叶抽商脚至绥办若哦僵舔椒丹庭倘社湛鳖请助尊涉退又儒甥烛漱第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件q在EditText中,每当任何一个键子

110、按下或抬起时,都会引发按键事件q为了能够使EditText处理按键事件,需要使用setOnKeyListener ()函数在代码中设置按键事件监听器,并在onKey()函数添加按键事件的处理过程1.entryText.setOnKeyListener(new OnKeyListener()2.Override3.public boolean onKey(View view, int keyCode, KeyEvent keyEvent) 4.int metaState = keyEvent.getMetaState();5.int unicodeChar = keyEvent.getUnico

111、deChar();6.String msg = ;域少图嗽贴嗅侮绘号错关泥蛋例芜熄摔斟德羔俯彪纱叙瘤酥勿谓军抡逾悉第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件7. msg +=按键动作: + String.valueOf(keyEvent.getAction()+n;8.msg +=按键代码: + String.valueOf(keyCode)+n;9.msg +=按键字符: + (char)unicodeChar+n;10.msg +=UNICODE: + String.valueOf(unicodeChar)+n;11.msg +=重复次数

112、: + String.valueOf(keyEvent.getRepeatCount()+n;12.msg +=功能键状态: + String.valueOf(metaState)+n;13.msg +=硬件编码: + String.valueOf(keyEvent.getScanCode()+n;14.msg +=按键标志: + String.valueOf(keyEvent.getFlags()+n;15.labelView.setText(msg);16.if (checkBox.isChecked()17.return true;18.else19.return false;20.靛板

113、阎泅度犬其兵咀篷状斤卉颈舆醒件慎辅膀缄览冠洼找附调缠勘恋溉靶第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.1 按键事件n第4行代码用来获取功能键状态。功能键包括左Alt键、右Alt键和Shift键,当这三个功能键被按下时,功能键代码metaState值分别为18、34和65;但没有功能键被按下时,功能键代码metaState值分别为0n第5行代码获取了按键的Unicode值,在第9行中,将Unicode转换为字符,显示在TextView中n第7行代码获取了按键动作,0表示按下按键,1表示抬起按键。第7行代码获取按键的重复次数,但按键被长时间按下时,则会产生这

114、个属性值n第13行代码获取了按键的硬件编码,不同硬件设备的按键硬件编码都不相同,因此该值一般用于调试n第14行获取了按键事件的标志符醛阎搏突青懦玄沁愉鼓卵九糟模申属昔坍习祁削掏掘雌顷嘉份豹褪陕氢呻第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件qAndroid界面框架支持对触摸事件的监听,并能够将触摸事件的详细信息传递给处理函数q需要设置触摸事件的监听器,并重载onTouch ()函数n第1行代码是设置控件的触摸事件监听器n在代码第3行的onTouch()函数中,第1个参数View表示产生触摸事件的界面控件;第2个参数MontionEvent表示触

115、摸事件的详细信息,如产生时间、坐标和触点压力等n第5行是onTouch()函数的返回值1.touchView.setOnTouchListener(new View.OnTouchListener()2.Override3.public boolean onTouch(View v, MotionEvent event) 4./过程代码5.return true/false;6.斑柳凰愉登怯萧唉痊吗虏爽眼懒牡供圾裸帘淡再疥惭硷镭瓮轨筋志侈庇给第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件qTouchEventDemo是一个说明如何处理触摸事件的示

116、例qTouchEventDemo用户界面n浅蓝色区域是可以接受触摸事件的区域,用户可以在Android模拟器中使用鼠标点击屏幕,用以模拟触摸手机屏幕n下方黑色区域是显示区域,用来显示触摸事件的类型、相对坐标、绝对坐标、触点压力、触点尺寸和历史数据量等信息肺厚辆壬捉镇痒部甲狰妈淹溶铜惩衬壳茸核廓拙明姨抓虹舅然氯砷轨莆揭第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q在用户界面中使用了线性布局,并加入了3个TextView控件n第1个TextView(ID为touch_area)用来标识触摸事件的测试区域n第2个TextView(ID为history

117、_label)用来显示触摸事件的历史数据量n第3个TextView(ID为event_label)用来触摸事件的详细信息,包括类型、相对坐标、绝对坐标、触点压力和触点尺寸拐率纪柴奉窄圾券殊恿摧维詹瘴纲畔柞私仔烷讼宏搅点丢厄三雷下默抛勺第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件qXML文件的代码如下1.2.6.12.凰悼菇东知售魁腺狈极吝印奴能壁躬裔捏胳埋栅孕疥疙砌臣河帝片犀弦沉第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件n第9行代码定义了TextView的背景颜色,#80A0FF是颜色代码n第

118、10行代码定义了TextView的字体颜色13. 17.18.22. 艺吾闽糠翁肚文髓糟箔批芽鹏哗绷睬终申靶睫娘撵惧页立俯满绪淌地燃干第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q在代码中为了能够引用XML文件中声明的界面元素,使用了下面的代码1.TextView labelView = null;2.labelView = (TextView)findViewById(R.id.event_label);3.TextView touchView = (TextView)findViewById(R.id.touch_area);4.final

119、 TextView historyView = (TextView)findViewById(R.id.history_label);黎敛王推救肉沥猪蔼伞迭帧弯沧炬倍醛抠秽略豁踏浆冕吕菩纱簧鲜立询臂第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q当手指接触到触摸屏、在触摸屏上移动或离开触摸屏时,分别会引发ACTION_DOWN、ACTION_UP和ACTION_MOVE触摸事件,而无论是哪种触摸事件,都会调用onTouch()函数进行处理q事件类型包含在onTouch()函数的MotionEvent参数中,可以通过getAction()函数获取到

120、触摸事件的类型,然后根据触摸事件的不同类型进行不同的处理q为了能够使屏幕最上方的TextView处理触摸事件,需要使用setOnTouchListener()函数在代码中设置触摸事件监听器,并在onTouch()函数添加触摸事件的处理过程磕沉擅帕湿炭锅售鼓搐兑乔消酗股汰溪牲碑鲍卸矣命夫享咸炳埋线漆柒炊第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件1.touchView.setOnTouchListener(new View.OnTouchListener()2. Override3. public boolean onTouch(View v,

121、MotionEvent event) 4. int action = event.getAction();5. switch (action) 6. case (MotionEvent.ACTION_DOWN): 7. Display(ACTION_DOWN,event);8. break;9. case (MotionEvent.ACTION_UP): 10. int historySize = ProcessHistory(event);11. historyView.setText(历史数据量:+historySize);12. Display(ACTION_UP,event); 13.

122、 break;14. case (MotionEvent.ACTION_MOVE): 15. Display(ACTION_MOVE,event);16. break;17. 蕾女会仟浸郭圣枕矽睬煞酬呻纺锹偏窜掉沥仟贯触涡风玩咱摄瓢拈南拇凝第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件n第7行代码的Display()是一个自定义函数,主要用来显示触摸事件的详细信息,函数的代码和含义将在后面进行介绍n第10行代码的ProcessHistory()也是一个自定义函数,用来处理触摸事件的历史数据,后面进行介绍n第11行代码是使用TextView显示历史

123、数据的数量18. return true;19. 20. );镰绚预垮晋符搐碍壬绅柳虑颤窟弄洽懂溶十砚静衡内餐文莹七判噬佐输犯第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件qMotionEvent参数中不仅有触摸事件的类型信息,还触点的坐标信息,获取方法是使用getX()和getY()函数,这两个函数获取到的是触点相对于父界面元素的坐标信息。如果需要获取绝对坐标信息,则可使用getRawX()和getRawY()函数q触点压力是一个介于0和1之间的浮点数,用来表示用户对触摸屏施加压力的大小,接近0表示压力较小,接近1表示压力较大,获取触摸事件触点

124、压力的方式是调用getPressure()函数q触点尺寸指用户接触触摸屏的接触点大小,也是一个介于0和1之间的浮点数,接近0表示尺寸较小,接近1表示尺寸较大,可以使用getSize()函数获取景宵聊绿腮酶书铀怎辕秆列仟指遏陛祝铰楔蹦陨密芳阳庞辫肖别碳坷来笺第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件qDisplay()将MotionEvent参数参数中的事件信息提取出来,并显示在用户界面上1.private void Display(String eventType, MotionEvent event)2. int x = (int)even

125、t.getX();3. int y = (int)event.getY();4. float pressure = event.getPressure();5. float size = event.getSize();6. int RawX = (int)event.getRawX();7. int RawY = (int)event.getRawY();8. 9. String msg = ;10. msg += 事件类型: + eventType + n;11. msg += 相对坐标:+String.valueOf(x)+,+String.valueOf(y)+n;12. msg +=

126、 绝对坐标:+String.valueOf(RawX)+,+String.valueOf(RawY)+n;13. msg += 触点压力:+String.valueOf(pressure)+, ;14. msg += 触点尺寸:+String.valueOf(size)+n;15. labelView.setText(msg);16. 燥狠烈娠矣龟表冀酣腾夜漾姿裳蹄帚佃搪贝痢圆院瞎絮拽晨尼艳准墅蝇弹第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q一般情况下,如果用户将手指放在触摸屏上,但不移动,然后抬起手指,应先后产生ACTION_DOWN和AC

127、TION_UP两个触摸事件q但如果用户在屏幕上移动手指,然后再抬起手指,则会产生这样的事件序列:ACTION_DOWN ACTION_MOVE ACTION_MOVE ACTION_MOVE ACTION_UP埔屎雏互赦锑局跺舒跑奢甘鸳句莆搓辨毯仍校希遂职蝗恩集切砒酱兢钦茂第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q在手机上运行的应用程序,效率是非常重要的。如果Android界面框架不能产生足够多的触摸事件,则应用程序就不能够很精确的描绘触摸屏上的触摸轨迹q如果Android界面框架产生了过多的触摸事件,虽然能够满足精度的要求,但却降低了应用

128、程序效率qAndroid界面框架使用了“打包”的解决方法。在触点移动速度较快时会产生大量的数据,每经过一定的时间间隔便会产生一个ACTION_MOVE事件,在这个事件中,除了有当前触点的相关信息外,还包含这段时间间隔内触点轨迹的历史数据信息,这样既能够保持精度,又不至于产生过多的触摸事件。气邵音传招奄掌络嚣栖伏酚搁掌烽炼旁工胚坪喜俯束左挖恨最仲桐廓斟园第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件q通常情况下,在ACTION_MOVE的事件处理函数中,都先处理历史数据,然后再处理当前数据1.private int ProcessHistory(M

129、otionEvent event)2. 3. int historySize = event.getHistorySize();4. for (int i = 0; i historySize; i+) 5. long time = event.getHistoricalEventTime(i);6. float pressure = event.getHistoricalPressure(i);7. float x = event.getHistoricalX(i);8. float y = event.getHistoricalY(i);9. float size = event.getH

130、istoricalSize(i);10. 11. / 处理过程.12. 13. return historySize;14. 操财渡斧考瑶为一息守拈惯擒际核涧亥哀邑谓凯衡秉衍宫鉴怖始厩杏甸淫第5章Android用户界面第5章Android用户界面5.5 界面事件n5.5.2 触摸事件n第3行代码获取了历史数据的数量n然后在第4行至12行中循环处理这些历史数据n第5行代码获取了历史事件的发生时间n第6行代码获取历史事件的触点压力n第7行和第8行代码获取历史事件的相对坐标n第9行获取历史事件的触点尺寸n在第14行返回历史数据的数量,主要是用于界面显示qAndroid模拟器并不支持触点压力和触点尺寸的模拟,所有触点压力恒为1.0,触点尺寸恒为0.0q同时Android模拟器上无法产生历史数据,因此历史数据量一直显示为0骤弯踌莱孤纺挠哨线腑灯镑夸颂味粉豢秃弓粕太算岛巷系翁棋现雾济代立第5章Android用户界面第5章Android用户界面

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号