[互联网]Android.ppt
Android,Android的发展和简介,Android并不是Google创造的,而是由Android公司所创造,创始人是Andy Rubin。后来该公司被Android收购。Google于2007年11月5日发布了Android 1.0手机操作系统,这个版本没有得到广泛的支持。2009年5月,Google发布了Android 1.5。这个版本提供了华丽的用户界面和蓝牙支持,才吸引了大量的开发者的目光,之后的Android版本更新很快,目前最稳定的版本是2.3,最新版本为4.0。,Android的发展和简介,市场上常见的手机操作系统:SymbianBlackBerryiPhonePalmWindows MobileAndroid目前Android的市场占有率还不高,但Android的竞争力已经显现,而且发展势头强劲,有可能成为最主流的手机操作系统。就国内环境来说,已有大量手机厂商开始手产Android操作系统的手机,因为Android平台是完全开放的,而且不需要支付任何费用,无论是知名品牌还是山寨手机厂商,Android都是一个不错的选择。目前已经开始发布使用Android系统的厂商有:摩托罗拉、三星、HTC、索尼爱立信、LG、华为、联想、中兴等。,Android平台架构及特性,Android系统的底层建立在Linux系统之上,由操作系统、中间件、用户界面和应用软件四层组成。Android采用一种被称为软件叠层(Software Stack)的方式进行构建。这种软件叠层的结构使层与层之间相互分离、明确各层的分工,保证了各层之间的低耦合。,Android平台架构及特性,Home,Contacts,Phone,Browser,PackageManager,TelephonyManager,ResourceManager,LocationManager,NotificationManager,ActivityManager,WindowManager,ContentProviders,ViewSystem,SurfaceManager,OpenGL|ES,SGL,MediaFrameWork,FreeType,SSL,SQLite,WebKit,libc,Core Libraries,Dalvik VirtualMachine,DisplayDriver,CameraDriver,Flash MemoryDriver,Binder(IPC)Driver,KeypadDriver,WiFiDriver,AudioDrivers,PowerManagement,应用程序层,应用程序框架,函数库,Andriod运行时,Linux内核,ContentProviders,ViewSystem,Android平台架构及特性,应用程序层:Android系统将会包含系列的核心应用程序,这些程序包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人等,这些应用程序都是用Java编写,我们主要学习的也是如何编写Android系统上的应用程序。应用程序框架:当我们开发Android应用程序时,就是面向应用程序框架进行的,所以无论系统应用程序和普通开发者的应用程序,都可以访问Android提供的API框架。,Android平台架构及特性,函数库:Android包含一套被不同组件所使用的C/C+库的集合。从上图可知,Android开发者一般不可以直接调用这套C/C+库的函数,但可以通过应用程序框架来调用。系统C库:一个从BSD系统派生出来的标准C系统库(libc)。并且专门为嵌入式Linux设备调整过。媒体库:基于PacketVideo的OpenCORE,这个媒体库支持播放和录制许多流行的音频和视频格式,以及查看静态图片。主要包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG等格式。,Android平台架构及特性,函数库:Surface Manager:管理对显示子系统的访问不,并可以对多个应用程序的2D和3D图层机提供无缝整合。LibWebCore:一个全新的Web浏览器引擎,该引擎为Android浏览器提供支持,也为WebView提供支持,WebView完全可以嵌入开发者自己的应用程序中。3D libraries:基于OpenGL ES 1.0 API实习的3D系统,这套3D库既可使用硬件3D加速,也可使用高度优化的软件3D加速。FreeType:位图和向量字体显示。SQLite:供所有应用程序使用的、功能强大的轻量级关系型数据库。,Android平台架构及特性,Android运行时:由两部分组成:Android核心库集:提供了Java语言核心库所能使用的绝大部分功能。Dalvik虚拟机:负责运行 Android应用程序。每个Android应用程序都运行在单独的一个Dalvik虚拟机内,因此Dalvik专门针对同时高效地运行多个虚拟机进行了优化,因此Android系统可以方便地实现对应用程序进行隔离。,由于Android应用程序的编程语言是Java,因此会有人把Dalvik虚拟机和JVM搞混,实际上Dalvik并未遵守JVM规范,两者也互不兼容。JVM运行字节码。而Dalvik运行的是其专有的dex(Dalvik Executable)文件。Dalvik无法直接运行字节码,它需要专有的DX工具将字节码编译成.dex文件来执行。,Android平台架构及特性,Android运行时:Dalvik虚拟机非常适合在移动终端上使用,相对于PC或服务器而言Dalvik虚拟机不需要很快的CPU速度和大量的内存空间,它主要有两个特点:运行专有的.dex文件:.dex文件减少了.class文件中的冗余信息,而且会把所有的.class整合到一个文件中,从而提高运行效率。DX工具还会对.dex文件进行一些性能的优化。基于寄存器实现:JVM和大多数虚拟机是基于栈(Stack)的,而Dalvik虚拟机则是基于寄存器的。基于寄存器的虚拟机会有更好的性能,但硬件通用性会略差。,Android平台架构及特性,Linux内核:Android系统建立在Linux 2.6之上,Linux内核提供了安全性、内存管理、进程管理、网络协议栈和驱动模型等核心系统服务。同时,Linux内核也是硬件层和软件层之间的抽象层。,搭建Android开发环境,Android的官方网站:http:/。登录http:/SDK的完整开发包,需要以在线安装的方式安装Android SDK,所以先解压以上软件包。包内目录结构如下:Add-ons:存放额外的附件软件。Platforms:存放不同版本的Android。Tools:存放Android开发、调试工具。SDK Manager.exe:运行此工具对SDK进行在线安装和管理。AVD Manager.exe:运行此工具对虚拟设备进行管理。,搭建Android开发环境,下载ADT插件压缩包(不解压)开打Eclipse点击菜单Help-Install New Software点击Add点击Archive选择下载的ADT包点击“OK”在Developer Tools打勾后点击“Next”选择“同意协议”,点击“Finish”,搭建Android开发环境,安装成功后,工具栏上多出两个图标:,搭建Android开发环境,点击第二个按钮“Opens the Android Virtual Device Manager”。点击“New”新建一个虚拟手机。选择已建好的虚拟手机,点击“Start”。,搭建Android开发环境,搭建Android开发环境,DDMS调试环境。点击右上角的OpenPerspective,选择DDMS进行Android开发时,程序中的System.out.println方法不会把信息输出到控制台,而是DDMS下的LogCat中。,HelloWorld安卓版,创建一个Android项目。在XML布局文件中定义应用程序的用户界面。(rs目录下的main.xml文件)编写代码。,程序说明,Main.xml是一个用户界面的设计文档,这样作的好处是降低了UI和业务代码之前的耦合度,让XML专门处理界面,Java代码专门处理业务逻辑。我们可以把它当成一个Android XML版的HTML页面进行设计、开发。只不过普通页面使用的是HTML标记,而main.xml使用的是Android标记。,程序说明,Main.xml详解:TextView:代表一个文本框。Button:代表一个按钮。Android:id:该属性指定控件的唯一标识,在Java代码中通过findViewById(“id”);来获取指定的界面控件对象。Android:layout_width/height:指定该界面控件的大小(宽度、高度),如果该属性值为fill_parent,则该控件填充父容器的大小,若为wrap_content则控件大小为刚好装下它的内容。,程序说明,Lx01Activity.java:这个程序很简单,它只作了三件事:使用main.xml文件定义的界面布局作为用户界面。获得ID为R.id.ok的按钮控件。为获得的按钮绑定监听器,并在onclick事件中改变ID为R.id.show的文本框控件的内容。那么R是哪来的?,程序说明,上图中,src、res、AndroidManifest.xml文件是Android项目所必须的,其它目录和文件是可选的。res:存放Android项目的各种资源文件。layout:存放界面布局文件。values:存放各种XML格式的资源文件,如字符串资源strings.xml、颜色资源colors.xml、尺寸资源dimens.xmldrawable-ldpi/drawable-mdpi/drawable-hdpi分别存放小、中、大三种图片。src:普通的Java源代码目录。AndroidManifest.xml:是Android项目的系统清单文件,用于控制Android应用的名称、图标、访问权限等整体属性。bin:自动编译之后会生成,存放字节码、资源打包文件(.ap_)、Dalvik虚拟机的可执行文件(.dex)等。gen:自动编译之后会生成,存入Android自动生成的R.java(清单文件)。,R.java,R.java是由aapt工具根据应用中的资源文件来自动生成的,因此我们可以把R.java理解成Android应用的资源字典。aapt生成R.java的规则主要有两条:每类资源对应R类的一个内部类。每个具体的资源项对应内部类的一个public static final int类型Field。,res目录,该目录里存放了Android应用所用到的所有资源,包括图片、字符串、颜色、尺寸等。Android按照约定,将不同的资源放在不同的文件夹内,这样可以方便地让AAPT工具来扫描这些资源,并为它们生成资源清单类:R.java。如:字符串资源文件:,使用资源,在Java代码中使用资源:通过AAPT工具生成的R.java,在Java代码中可以用R.string.app_name的方式引用到“Androidtest”这个字符串。在XML文件中使用资源:按照规定的格式:/例如:string/app_name当需要给某些组件分配标识符且无需使用专门的资源进行定义时,使用如下格式:+id/例如:android:id=+id/show,AndroidManifest.xml,AndroidManifest.xml清单文件是每个Android项目都必需的,它是整个Android应用的全局描述文件。AndroidManifest.xml清单文件说明了该应用的名称、所使用的图标,以及包含的组件等。AndroidManifest.xml通常包含如下信息:应用程序的包名,将会作为该应用的唯一标识。应用程序所包含的组件,如Activity、Service、BroadcastReceiver和ContentProvider等。应用程序兼容的最低版本。应用程序使用系统所需的权限声明。其他程序访问该程序所需的权限声明。任何Android项目都会有一个AndroidManifest.xml文件,随着项目开发的不断进行,此文件也会有相应的修改。,应用程序权限说明,一个Android应用可能需要权限才能调用Android系统的功能,也可能被其他应用调用,因此,它也需要声明调用自身所需要的权限。声明该应用自身所拥有的权限:通过为元素添加子元素即可为自身声明权限。例如声明自身需要打电话权限:声明调用该应用自身所需的权限:通过为元素添加子元素即可声明调用该程序所需的权限。例如:Android系统提供了大量权限,这些权限位于Manifest.permission类中。,基本组件介绍,Android应用通常是由一个或多个基本组件组成,前面我们看到Android应用中最常用的组件就是Activity。Android应用还可能包括Service、BroadcastReceiver、ContentProvider等组件,现在先进简单介绍。,基本组件介绍,Activity和View:Activity是Android应用中负责与用户交互的组件大家可以把它想象成初级课程界面编程中的JFrame控件,只不过在布局方面有些差异。View组件是所有UI控件、容器控件的父类(基类)。它就是用户在Android应用中实际看到的部分,但View组件需要入到容器组件中或使用Activity将它显示出来,调用setContentView()方法。例如:LinearLayout lo=new LinearLayout(this);super.setContentView(lo);Activity为Android应用提供可视化用户界面,如果该应用包含多个界面,那么此应用将会包含多个Activity,它们组成Activity栈,当前界面的Activity位于栈顶。Activity包含了一个setTheme(int resid)方法来设置其窗口的风格,例如是否显示标题、以对话框形式显示窗口等。,基本组件介绍,ServiceService与Activity的地位是并列的,它也代表一个单独的Android组件。它们的区别在于:Service通常位于后台运行,且不与用户交互,所以Service没有GUI。与Activity需要继承Activity基类相似,Service组件需要继承Service基类,Service组件被运行起来之后,它拥有自己独立的生命周期。Service组件通常用于为其它组件提供后台服务或监控其他组件的运行状态。,基本组件介绍,BroadcastReceiverBroadcastReceiver是Android应用中另一个重要的组件,由名字可知,BroadcastReceiver是广播消息接收器,从代码实现的角度来看,BroadcastReceiver非常类似于事件编程中的监听器。与普通监听器不同的是:普通监听器监听的事件源是程序中的对象,而BroadcastReceiver监听的是Android应用中的其它组件。开发者只需实现自己的BroadcastReceiver子类,并重写onReceive(Context ct,Intent it)方法。当其它组件通过sendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法发送广播消息时,如果接收器对该消息“感兴趣”(通过IntentFilter设置),BroadcastReceiver组件的onReceive()方法就会被触发。当开发者完成BroadcastReceiver组件时,有两种方法可以注册这个系统级的“事件监听器”:在Java代码中通过Context.registReceiver()方法进行注册。在AndroidManifest.xml文件中使用元素完成注册。,基本组件介绍,ContentProvider对于Android应用而言,它们必须相互独立,各自运行在自己的Dalvik虚拟机实例中,但如果这些应用之间需要进行实时的数据交互,例如收发短信时需要读取“通讯录”中的联系人数据,这就需要多个应用程序之间进行实时的数据交换。Android系统为这种跨应用的数据交换提供了一个标准:ContentProvider,当程序员实现自己的ContentPrivider时,需要实现如下方法:insert(Uri,ContentValues):向ContentProvider插入数据delete(Uri,ContentValues):删除ContentProvider中的指定数据update(Uri,ContentValues,String,String):更新ContentProvider中数据query(Uri,String,String,String,String):从ContentProvider中查询数据通常与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,另一个应用通过ContentResolver来访问数据。,基本组件介绍,Intent和IntentFilter:严格的说,它们并不是Android应用的组件,但它对于Android应用的作用非常大它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同的组件时,通常需要借助于Intent来实现。Intent可以启动应用中另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息来触发系统中的BroadcastReceiver,也就是说:以上三种组件都可以把Intent作为通信的载体,只是不同组件使用Intent的机制略有不同而已。启动Activity时,可调用Context.startActivity(Intent itt)启动Service时,可调用Context.startService(Intent itt)触发BroadcastReceiver时,可调用Context.sendBroadcast(Intent itt)、sendStickyBroadcast(Intent itt)或sendOrderedBroadcast(Intent itt)方法发送广播消息。,Android应用的界面编程,界面编程,Android应用开发的一项内容就是用户界面的开发。不管应用实际包含的逻辑多么复杂、多么优秀,如果没有提供一个友好的图形用户界面,也很难吸引用户,Windows的成功主要就是来自于它的GUI的易用性。同样,Android应用也要有一个很方便操作的界面才能被更多用户喜欢和使用,这样的程序才有价值。Android提供了大量功能丰富的UI组件,开发者只要像搭积木那样把它们组合起来,就可以形成一个漂亮的图形用户界面。,视图组件,Android应用的绝大部分UI组件都放在android.widget包及其子包、android.view包及其子包当中,Android应用的所有UI组件都继承了View类,View组件非常类似于Swing编程中的JPanel,它代表一个空白的矩形区域。View类还有一个重要的子类:ViewGroup,它通常作为其它组件的容器使用。Android的所有UI组件都是建立在View、ViewGroup基础之上,Android采用了组合器设计模式来设计View和ViewGroup,ViewGroup是View的子类,所以ViewGroup也可以被当成View使用。Android应用的GUI中,ViewGroup被当作其它View的容器使用,而ViewGroup中还可以包含ViewGroup。,View,ViewGroup,View,View,View,View,ViewGroup,View类,View类的XML属性、相关方法及说明ViewGroup继承了View类,所以也可以看作是普通的View,但它主要的作用还是作为容器使用,但ViewGroup是一个抽象类,所以实际中通常是使用ViewGroup的子类作为容器,例如各种布局管理器。ViewGroup容器控制它的子组件的分布依赖于ViewGroup.LayoutParams、ViewGroup.MarginLayoutParams两个内部类。这两个内部类提供了一些XML属性,ViewGroup容器中的子组件可以指定这些XML属性。,ViewGroup,layout_height/layout_width支持下面三种值:fill_parent:指定子组件的宽度或高度与父组件相同。match_parent:同上,从Android2.2开始用此属性替代上面。wrap_content:组件大小为刚好包含其内容的大小。,使用XML布局文件控制UI,Android推荐使用布局文件来控制视图,这样不仅简单明了,而且可以将应用的视图控制逻辑从Java代码中分离出来,更好地体现MVC原则。我们要在res/layout目录下定义一个主文件任意的XML布局文件(R.java会自动收录),在Java代码中,我们可以通过如下方式在Activity中显示该视图:setContentView(R.layout.);/不带后缀每个UI组件都有自己的android:id属性,在Java代码中可以通过此ID获得组件:findViewById(R.id.);,使用Java代码开发UI,虽然Android推荐使用XML布局文件来控制UI,但如果开发者愿意,也可以像Swing应用一样完全在Java代码中生成UI。在实际的开发中,代码开发UI不仅烦琐,而且不利于解耦,而使用XML布局虽然方便、合理,但又不够灵活,所以经常会用两种方法结合的方式来管理UI。,实例:图片浏览器,编辑布局文件复制图片到资源目录编写代码运行,开发自己的View组件,Android应用中的所有UI组件,它们都继承了View组件,然后在View组件提供的空白区域上绘制自己的外观。所以当系统提供的View组件不能满足项目需要时,程序员可以开发自己的View组件。要开发自定义的View组件,首先要继承View类,然后重写一个或多个方法。,可以被重写的方法,构造方法:重写构造器是自定义View的最基本方式。onFinishInflate():当应用从XML文件加载该组件并用它构建完界面之后,该方法被回调。onMeasure(int,int):用来检测View组件及其所有子组件的大小。onLayout(boolean,init,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):当包含该组件的窗口的可见性发生改变时触发。开发自定义View组件不并需要重写以上所有方法。,实例:跟随手指的小球,现在我们来实现一个可以显示一个小球,跟着我们的手指移动的组件。当用户手指在屏幕上拖动时,程序监听这个事件,并把手指的当前位置传入自定义的组件,组件重新在屏幕上绘制小球。本例只需重写onDraw()方法。,布局管理器,布局管理器,为了更好地管理Android应用的用户界面里的各组件,Android提供了布局管理器。通过使用布局管理器,Android应用的GUI具有良好的平台无关性。一般我们推荐使用布局管理器来管理组件的分布、大小,而不是直接设置组件的位置和大小,因为不同手机的屏幕分辨率、尺寸各不相同,如果让程序手动控制每个组件的大小、位置,将给编程带来巨大的困难,为了解决这个问题,Android提供了布局管理器根据运行平台来调整组件的大小,而程序员要用的只是为容器选择合适的布局管理器。,布局管理器,Android的布局管理器本身就是一个UI组件,所有的布局管理器都是ViewGroup的子类。,View,ViewGroup,LinearLayout,TableLayout,AbsoluteLayout,FrameLayout,RelativeLayout,线性布局,LinearLayout类,有点像AWT中的FlowLayout,它们都会将容器里的组件一个挨一个地排列起来,LinearLayout不仅可以控制各组件横向排列,也可以控制组件纵向排列(通过android:orientation属性控制)需要注意的是LinearLayout布局不会换行:当组件排到容器尽头时,其余的组件将不会被显示。,线性布局,偿试改变android:orientation和android:gravity属性的值(参考上页),看一下不同的效果。,表格布局,TableLayout,表格布局采用行列形式管理UI组件,TableLayout不需要明确地声明有多少行和列,而是通过添加TableRow、其它组件来控制表格的行数、列数。每次向TableLayout添加一个TableRow,就是在向表格添加一行,TableRow也是容器,可以向TableRow中添加组件,每添加一个组件,即是添加一列。如果直接向TableLayout添加组件,则认为这个组件占用一行。表格布局中列的宽度即是每一列中最宽的组件的宽度。表格布局中,可以为单元格设置如下三种属性:Shrinkable:拥有此属性的列,宽度将被收缩以适应父容器的宽度。Stretchable:拥有此属性的列,宽度将被拉伸以适应父容器的宽度。Collapsed:拥有此属性的列将被隐藏。,帧布局,FrameLayout:帧布局容器为每个加入其中的组件创建一个空白的区域,一个空白区域称为一帧,帧布局容器会把容器中的所有组件一个一个叠放在一起(同一位置),这一点和AWT中的CardLayout相似,但不同点是FrameLayout不能把下面的组件移到上面。,实例:霓虹灯效果,编辑布局文件main.xml(和上例相同)编辑资源文件:strings.xmlcolors.xml编辑Java代码运行,相对布局,RelativeLayout:相对布局容器内子组件的位置总是相对兄弟组件、父容器来决定的,因此这种布局方式被称为相对布局。如果B组件的位置是由A组件的位置来决定的,Android要求先定义A组件,再定义B组件。,相对布局的属性及方法,为了控制该布局容器中各子组件的布局分布,RelativeLayout提供了一个内部类:RelativeLayout.LayoutParams,该内部类提供了大量的XML属性来控制RelativeLayout中子组件的布局分布。RelativeLayout.LayoutParams属性说明,相对布局实例:梅花布局效果,绝对布局,AbsoluteLayout:像AWT的空布局一样,布局管理器不提供任何布局控制,而是由开发人员自己通过X、Y坐标来控制组件的位置。当使用绝对布局时,布局容器不再管理组件的大小、位置,全部由开发人员自己控制。在绝大部分情况下,不推荐使用绝对布局,因为手机屏幕的大小、分辨率各不相同,使用绝对布局很难保证应用的通用性。使用绝对布局时,每个子组件都可以指定如下两个XML属性:layout_x和layout_y,绝对布局实例:登录界面,距离单位:px:像素。dip/dp:设备独立像素,基于屏幕密度的抽象单位,dip与px的比例换算随着屏幕大小的变化而变化sp:比例像素,主要处理字体大小in:英寸mm:毫米pt:磅,标准长度单位,1/72英寸,基本界面组件,TextView,CheckedTextView,EditText,Chronometer,Button,DigitalClock,AutoCompleteTextView,ExtractEditText,MultiAutoCompleteTextView,CompoundButton,CheckBox,RadioButton,ToggleButton,TextView,TextView直接继承了View从功能上看,TextView是一个文本编辑器,只是Android关闭了它的文字编辑功能,如果想要定义一个可编辑的文本框,则可以使用它的子类:EditText。TextView的XML属性及相关方法说明,实例:不同字体颜色的文本、URL和带边框、图片的文本,实例:用户友好的输入界面,按钮与图片按钮,Button和ImageButton的功能都非常单一,主要是在UI上生成一个按钮供用户点击,当组件被点击的时候,触发一个OnClick事件。ImageButton的text属性无效。按钮可以通过background属性为按钮增加背景色或背景图片,但这种设置是固定的,不能通过事件和代码进行更改,所以我们需要自己开发功能更强大的按钮。,按钮与图片按钮,为了定义可以随用户动作而改变的按钮,可以考虑使用XML资源文件来定义Drawable对象,再将Drawable对象设为Button的background属性值,或ImageButton的src属性值。,单选按钮和复选框,RadioButton和CheckBox是很普通的UI组件,Android中它们都继承了Button组件,所以Button组件的所有属性,它们都可以使用。不同点是它们多了一个可选中的功能:android:checked,该属性用于设置初始时是否被选中。RadioButton和CheckButton的不同点是因为RadioButton有排它性,所以需要和RadioGroup一起使用,来定义一组单选按钮。,状态开关按钮,ToggleButton,与CheckBox非常相似,表示选中和未选中两个状态。ToogleButton主要用于切换程序中的某种状态。实例:动态改变布局,时钟组件,AnalogClock(时针时钟)继承了View组件,它重写了onDraw方法,在View上绘制时钟(没有秒针)。DigitalClock(数字时钟)继承了TextView组件,就是一个显示时间的文本框。,图像视图组件,ImageView:主要用于显示图片,其实它可以显示任何Drawable对象。,android:scaleType可选值,matrix:使用matrix方式进行缩放fitXY:对图片横、纵向独立缩放,使图片完全适应ImageView的大小,图片比例可能会改变fitStart:保持横纵比的缩放,图片较长的边长与ImageView相应的边相同,之后在左上角显示fitCenter:同上,居中显示fitEnd:同上,右下角显示Center:居中显示,不进行缩放centerCrop:保持横纵比的缩放,使得图片能完全覆盖ImageViewcenterInside:保持横纵比的缩放,使得ImageView能完全显示该图片,自动完成文本框,AutoCompleteTextView:从EditView派生出来,比普通文本框多一个功能,当用户输入一定字符之后,自动完成文本框会显示一个下拉菜单,供用户选择。,自动完成文本框,使用自动完成文本框很容易,只要为它设置一个Adapter,其中封装AutoComplete TextView预设的提示文本。,Spinner组件,Spinner其实就是一个列表选择框,不过Android的列表选择框并不是需要显示下拉列表的,而是相当于弹出一个菜单供用户选择。,日期、时间选择器,日期和时间选择器都派出自FrmaeLayout。DatePickerTimePicker,进度条,ProgressBar:进度条组件主要用于在进行长时间处理操作时显示进度使用户不会感觉程序失去响应,提高界面的友好性。可以通过style属性控制进度条的风格:android:style/Widget.ProgressBar.Horizontal:水平进度条android:style/Widget.ProgressBar.Inverse:普通大小进度条android:style/Widget.ProgressBar.Large:大进度条android:style/Widget.ProgressBar.Large.Inverse:大进度条android:style/Widget.ProgressBar.Small:小进度条android:style/Widget.ProgressBar.Small.Inverse:小进度条,进度条组件的属性,拖动条,SeekBar:和进度条类似的组件,区别是进度条用颜色表示进度的数据,拖动条通过滑块表示数值。属性:Android:thumb:指定一个Drawable对象,该对象将作为自定义滑块,用拖动条改变图片透明度,星级评分条,RatingBar:星级评分条与拖动条十分相似,它们有相同的父类:AbsSeekBar。常用属性:,实例:星级评分条改变图片透明度,选项卡,TabHost:是一种非常实用的组件,可以很方便地在窗口上放置多个标签页,每个个标签页相当于获得了一个与外部容器相同大小的组件摆放区域,可以通过选项卡组件在容器中放置更多组件。常用方法:newTabSpec(String tag):创建选项卡。addTab(TabHost.TabSpec tabSpec):添加选项卡使用步骤:在界面布局中定义TabHost组件并为其定义内容Activity继承TabActivity调用getTabHost()方法获取TabHost对象通过TabHost对象的方法来创建选项卡、添加选项卡,实例:通话记录界面,列表视图,ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项,创建ListView有两种方式。直接使用ListView创建。让Activity继承ListActivity。,实例:基于数组的ListView,textViewResourceId,上面的实例代码中创建了一个ArrayAdapter,创建它的时候必须指定一个textViewResourceId,该参数决定每个列表项的外观形式,可使用的值有:simple_list_item_1:每个列表项都是普通的TextViewsimple_list_item_2:同上,字体略大。simple_list_item_checked:每个列表项都是已勾选的simple_list_item_multiple_choice:每个列表项都带多选框simple_list_item_single_choice:每个列表项都带单选按钮试着将上面代码的中该参数值改为其他值,看看效果是不是如描述一样。,实例:基于ListActivity的实现,如果程序的窗口仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现。无需调用setContentView()方法来界面,而是直接传入一个内容Adapter。,实例:用SimpleAdapter创建ListView,可展开的列表组件,ExpandableListView:是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。ExpandableListView的用法与普通ListView的用法非常相似,只是ExpandableListView所显示