您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 《Android应用程序开发》第4章 用户界面开发
第4章用户界面开发一个好的应用界面的必备条件是:内容清楚、指示明白、屏幕美观和有亲切感。界面通常包含图形和文字。应用界面的设计是对控件进行适当的取舍及功能的选择和处理的过程。在程序设计中,需要对设计的方法反复推敲、琢磨,才能使其达到完美的境界。Android平台提供的控件是非常完美的,控件的使用与网页的设计类似,尽量用parent_width等抽象长度,用Theme来定制风格,抽取所有的字串等信息进行本地化设计。Android的界面需要写在“res/layout”下面的布局文件中,一般情况下,一个布局文件对应一个界面。设计Android的界面有点像写HTML代码,要先给Android定框架,然后再往框架里面放控件。本章将详细介绍这些框架和能够放在框架中的常用控件。本章可以作为这些框架和控件的查询手册,可供你在开发过程中随时查阅。本章各小节目录4.1用户界面开发详解4.2常用控件应用4.3界面布局4.4小结4.1用户界面开发详解Android应用程序的基础功能单元就是Activity类中的一个对象。Activity可以做很多事,比如界面显示、事件处理等。Android应用程序界面通常使用View和ViewGroup控件配XML样式来进行设计;而事件则包括按钮事件、触屏事件以及一些高级控件的事件监听。下面我们分别介绍Activity的界面设计、显示和事件处理。4.1.1用户界面简介Android生成屏幕有三种方式:xml配置生成;通过用户界面接口生成;直接用代码生成。在一个Android应用中,用户界面是由View和ViewGroup对象构建的。View与ViewGroup都有很多种类,而它们都是View类的子类。开发者可以对View和ViewGroup进行组合,来完成应用程序界面设计。下面我们分别来讨论View和ViewGroup。1.View任何一个View对象都将继承android.view.View类。它是一个存储有屏幕上特定的一个矩形布局和内容属性的数据结构。一个View对象可以处理测距、布局、绘图、焦点变换、滚动条,以及屏幕区域自己表现的按键和手势。作为一个基类,View类为Widget服务,Widget则是一组用于绘制交互屏幕元素的完全实现子类。Widget处理自己的测距和绘图,所以可以快速地用它们去构建UI。可用到的Widget包括Text、EditText、Button、RadioButton、Checkbox和ScrollView等。2.ViewGroupViewGroup是一个android.view.Viewgroup类的对象。顾名思义,ViewGroup是一个特殊的View对象,它的功能是装载和管理一组下层的View和其他ViewGroup,ViewGroup可以为UI增加结构,并且将复杂的屏幕元素构建成一个独立的实体。作为一个基类,ViewGroup为Layout(布局)服务,Layout则是一组提供屏幕界面通用类型的完全实现子类。Layout可以为一组View构建一个结构。图4-1是一个由View和ViewGroup布局的Activity界面。从图4-1中可以看出,一个Activity界面可以包含多个ViewGroup和View,通过这样的组合可以实现更复杂、更完美、更满足开发者需要的界面。当Activity调用它的setContentView()方法并且传递一个参数给根节点对象时,一旦Android系统获得了根节点的参数,它就可以直接通过节点来测距和绘制树。当Activity被激活并获得焦点时,系统会通知Activity并且请求根节点测距并绘制树,根节点就会请求它的子节点去绘制它们自己。同时,每个树上的ViewGroup节点负责绘制它的直接子节点。正如之前提到的,每个ViewGroup都有测量它的有效空间、布局它的子对象并且调用每个子对象的Draw()方法去绘制它们自己。子对象可能会请求获取它们在父对象中的大小和位置,但是父对象对每个子对象的大小和位置有最终的决定权。4.1.2事件处理什么是事件呢?事件就是用户与UI(图形界面)交互时所触发的操作。例如,在手机键盘上按下一个键,就可以触发几个事件。键盘上的键被按下时就触发了“按下”事件,当松开按键时又会触发“弹起”事件。在Android中,这些事件都将被传送到事件处理器,它是一个专门接受事件对象并对其进行翻译和处理的方法。在Java程序中,实现与用户交互功能的控件都需要通过事件来处理,需要指定控件所用的事件监听器。当然,Android同样需要设置事件监听器。另外,在Android下,View同样可以响应按键和触屏两种事件,分别如下所示。booleanonKeyDown(intkeyCode,KeyEventevent)用于响应按键按下。booleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent)用于响应按键重复点击。官方API指出onKeyMultiple方法总是返回false,即它没有handle,因此必须重写才能实现。booleanonKeyUp(intkeyCode,KeyEventevent)用于响应按键释放,onTouchEvent(MotionEventevent)用于响应触摸屏事件。下面我们通过一个示例程序(具体参见本书所附代码:第4章\Examples_04_01)来处理各种事件,主要包括:Button控件事件监听、按键按下事件、按键弹起事件、触笔点击事件。示例成功运行后,点击“OK”按钮后如图4-2所示,按键“按下”时如图4-3所示,按键“弹起”时如图4-4所示,触笔点击屏幕时如图4-5所示。具体实现如代码清单4-1所示。下面分析如何处理这些事件,在Android中,控件事件是通过设置其控件的监听器来监听并重写某些函数来处理的。具体实现请参见本书所附代码:第4章\Examples_04_01。这里需要说明的是,我们使用了Toast.makeText(this,string,Toast.LENGTH_SHORT).show();来显示一个短时间的提示信息。代码清单4-1第4章\Examples_04_01\src\com\yarin\android\Examples_04_01\Activity01.java/****控件事件通过设置其控件的监听器来监听并处理事件*按键按下事件:通过重写onKeyDown方法*按键弹起事件:通过重写onKeyUp方法*触笔点击事件:通过实现onTouchEvent方法*示例中使用了Toast控件:*Toast.makeText(this,string,Toast.LENGTH_SHORT).show();*显示提示信息**/publicclassActivity01extendsActivity{publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//获得Button对象Buttonbutton_ok=(Button)findViewById(R.id.ok);//设置Button控件监听器button_ok.setOnClickListener(newButton.OnClickListener(){publicvoidonClick(Viewv){//这里处理事件DisplayToast(点击了OK按钮);}});}/*按键按下所触发的事件*/publicbooleanonKeyDown(intkeyCode,KeyEventevent){switch(keyCode){caseKeyEvent.KEYCODE_DPAD_CENTER:DisplayToast(按下:中键);break;caseKeyEvent.KEYCODE_DPAD_UP:DisplayToast(按下:上方向键);break;caseKeyEvent.KEYCODE_DPAD_DOWN:DisplayToast(按下:下方向键);break;caseKeyEvent.KEYCODE_DPAD_LEFT:DisplayToast(按下:左方向键);break;caseKeyEvent.KEYCODE_DPAD_RIGHT:DisplayToast(按下:右方向键);break;caseKeyEvent.KEYCODE_0:DisplayToast(按下:0);break;}returnsuper.onKeyDown(keyCode,event);}}/*按键弹起所触发的事件*/publicbooleanonKeyUp(intkeyCode,KeyEventevent){switch(keyCode){caseKeyEvent.KEYCODE_DPAD_CENTER:DisplayToast(弹起:中键);break;caseKeyEvent.KEYCODE_DPAD_UP:DisplayToast(弹起:上方向键);break;caseKeyEvent.KEYCODE_DPAD_DOWN:DisplayToast(弹起:下方向键);break;caseKeyEvent.KEYCODE_DPAD_LEFT:DisplayToast(弹起:左方向键);break;caseKeyEvent.KEYCODE_DPAD_RIGHT:DisplayToast(弹起:右方向键);break;caseKeyEvent.KEYCODE_0:DisplayToast(弹起:0);break;}returnsuper.onKeyUp(keyCode,event);}publicbooleanonKeyMultiple(intkeyCode,intrepeatCount,KeyEventevent){returnsuper.onKeyMultiple(keyCode,repeatCount,event);}/*触笔事件*/publicbooleanonTouchEvent(MotionEventevent){intiAction=event.getAction();if(iAction==MotionEvent.ACTION_CANCEL||iAction==MotionEvent.ACTION_DOWN||iAction==MotionEvent.ACTION_MOVE){returnfalse;}//得到触笔点击的位置intx=(int)event.getX();inty=(int)event.getY();DisplayToast(触笔点击坐标:(+Integer.toString(x)+,+Integer.toString(y)+));returnsuper.onTouchEvent(event);}/*显示Toast*/publicvoidDisplayToast(Stringstr){Toast.makeText(this,str,Toast.LENGTH_SHORT).show();}}在Examples_04_01项目中,我们分析了一些常用的事件处理方式。每个键都对应一个键值。当然,可以根据需要来改变一些键的功能,这就需要我们自己构建KeyEvent对象,构造KeyEvent对象的方式有如下几种:KeyEvent(intaction,intcode);KeyEvent(longDownTime,longEventTime,intaction,intcode,intrepeat);KeyEvent(longDownTime,longEventTime,intaction,intrepeat,intmetState);KeyEvent(longDownTime,longEventTime,intaction,intcode,intrepeat,intmetState,intdevi
本文标题:《Android应用程序开发》第4章 用户界面开发
链接地址:https://www.777doc.com/doc-3205240 .html