




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
UIAndroid中全部的界面都是由视图构成。例如文本框,按钮,分割线,等等。所有的视图都有一个公共的基类View。其中ViewGroup是View的子类,可作为View的容器,完成View的布局(所有的布局都是ViewGroup的子类)。Window中的所有View都是在一棵树内。即可以通过代码也可以通过XML配置文件来向这个树中添加View。视图树如下图:IDView可能有一个数字ID类型。这个ID通常是在XML中定义,主要用于在视图树种查找指定的View。例如:l 在样式文件中定义一个按钮,分配一个唯一ID:l 在Activity中,可以查找这个按钮:注意,ID在一颗树内可能是不唯一的,但是最好要保证在视图树内的一部分要唯一。位置视图是一个矩形结构。拥有1个坐标和2个尺寸。坐标是矩形左上角的坐标;尺寸是宽和高。坐标和尺寸的单位为像素(pixel,组成屏幕的图象的最小独立元素)。可以通过view.getLeft()和view.getTop()来获取坐标。为了方便还有2个方法,view.getRight()和view.getBottom()。关系如图,淡黄色的是父View,绿色的是当前View。例如:当view.getLeft()返回20就代表着这个view是在所属的父View的左边缘右侧20像素。如上图中就是left为20像素。大小,填充和边距视图的大小是通过宽和高来表示。视图通常会有2组宽高值。l 第一组,估计值这组值决定视图在其父视图内想要占据的大小。可通过view.getMeasuredWidth()和view.getMeasuredHeight()。l 第二组,实际值这组值决定视图在屏幕上的实际尺寸。这组值可能与估计值相同。可通过view.getWidth()和view.getHeight()获得。Padding(内边距)是以像素为单位,表示内容距离边框的大小,拥有4个值left,top,right,bottom。可通过view.setPadding(left,top,right,bottom)或者view.setPaddingRelative(start,top,end,bottom)来设置,获取可通过view.getPaddingLeft(),view.getPaddingTop(),view.getPaddingRight(),view.getPaddingBottom(),getPaddingStart(),getPaddingEnd()。Margins(外边距)是在ViewGroup中提供,普通View不提供该属性,使用padding即可。注:paddingStart,paddingEnd与paddingLeft,paddingRight有什么差别呢?首先对于中国大陆来说,这个是没有任何差别的。在android4.1开始对双向文字进行有限支持,4.2开始对从右到左的文字进行了原生级别全面支持。paddingStart在LTR中与paddingLeft相同;在RTL中与paddingRight相同。布局布局分2个过程:1. 测量过程测量过程是在view.measure(widthMeasureSpec,heightMeasureSpec)方法中完成,并且会自上向下遍历视图树。每个视图通过递归方式向下推送尺寸明细。在最后每个视图保存自己的尺寸。2. 实际布局实际布局是在view.layout(left,top,right,bottom)方法中完成。同样是自上而下。在这个过程中,所有的父View均会使用之前测量好的值来定位全部子View的位置。注意在view.measure()方法执行后,因为子视图需要,所以view.getMeasureWidth()和view.getMeasureHeight()必须可以取到值。为了保证在测量过程的最后,所有的父视图都可以接受子视图的大小,视图在测量宽和高时必须要遵守父视图所派给的约束(宽,高)。父视图或许会调用measure方法多次测量它的子视图。例如:首先父视图会不限制尺寸来计算每一个子视图,这样父视图可以知道它的子视图想要的大小;然后,如果子视图无限制的尺寸过大或者过小,父视图会使用实际值来再次执行mesasure方法。测量过程会使用2个类来传递尺寸:l View.MeasureSpec描述视图希望的测量和定位方式。有三种模式:1. UNSPECIFIED:父视图给子视图一个尺寸,但是由子视图来决定自身真正的尺寸。2. EXACTLY:父视图给子视图指定的明确尺寸。子视图必须使用。3. AT_MOST:父视图给子视图指定的最大尺寸。l ViewGroup.LayoutParams描述视图希望的宽和高。有3类值可以指定:1. 精确值:数字,单位可以是px(像素),dp(无关密度的像素),sp(优先字体大小缩放的像素值),in(物理屏幕的英寸),mm(物理屏幕的毫米)2. Match_parent:视图会尽可能与父视图content一样大。(使用Fill_parent已经过时,在API 8之前使用。)3. Wrap_content:视图会尽可能与自身的content一样大。另外注意不同的ViewGroup子类可能有不同的LayoutParams子类。绘图通过遍历视图树,并且渲染每一个视图。根据视图树遍历顺序,父视图会在它的子视图之前绘制,同级视图会按照出现树中的顺序来绘制。如果给视图设置背景,背景会在视图的onDraw()方法之前绘制。onDraw()方法是绘制视图的方法。注意,android的框架不会在视图无效的区域进行绘制。强制视图进行绘制可以调用invalidate()事件处理及线程视图基本循环:1. 事件进入,转发至合适的视图。视图会处理事件及通知一个的监听。2. 在事件的处理过程中,视图的边界有可能变化,此时视图会调用requestLayout()。3. 在事件的处理过程中,视图的外观有可能变化,此时视图会调用invalidate()。4. 如果requestLayout()或者invalidate()有执行过,框架会适当的进行测量,布局及绘制。注意:视图树是在一个单线程中。只能在UI线程中执行相关方法。在其他线程中想要修改需要使用Handler。焦点处理视图中的焦点针对方向键或者轨迹球之类的硬件才出现的。框架会针对用户的输入处理常规的焦点移动。包括移除视图,隐藏视图,新增视图。通过isFocusable()来检测视图是否可获得焦点。可通过setFocusable(boolean)来设置。在触摸模式下,需要使用isFocusableInTouchMode()来检测视图是否可获得焦点,可通过setFocusableInTouchMode(boolean)设置。触摸模式对于一个可触摸的设备,一旦用户触摸屏幕,设备会立即进入触摸模式。此模式下,只有isFocusableInTouchMode()返回true时才可获得焦点,例如文本框。也有一些不需要获取焦点的,例如按钮(只监听onclick事件即可)触摸模式的状态被保存在activity中,通过isInTouchMode()来检查是否在触摸模式。滚动对于视图内部滚动,框架提供了基本的支持。包括沿X,Y滚动及滚动条绘制。view.scrollBy(x,y) 滚动的起始位置。view.scrollTo(x,y) 滚动的结束位置。view.awakenScrollBars() 触发滚动条的绘制。TAGS(标记)虽然叫做标记,但是并不是用来识别视图的。TAGS基本上是一组与视图有关系的扩展数据。通常是为了方便而储存视图自身的数据。2个方法进行储存View.setTag(int key,Object tag)View.setTag(Object tag)2个方法进行读取View.getTag(int key)View.getTag()属性视图公开的属性有alpha,和一些与视图变化相关的属性。例如:TRANSLATION_X和TRANSLATION_Y。可通过2种方式获得:1. Property形式例如:View.ALPHA.get(viewObj)可获取viewObj的alpha值。2. Setter/Getter形式例如:viewObj.getAlpha()可获取viewObj的alpha值。这些属性的主要目的是设置视图渲染相关的持久化状态,主要用于动画动画从android3.0开始,推荐使用android.animation包来制作动画。该包下的类会修改视图中的真实属性。与3.0之前的动画相比,不再仅仅是视图绘制及显示。可用setAnimation(animation)和startAnimation(animation)。安全性有时应用本身必须要验证所要执行的行为,这个行为是经过用户充分了解和同意的。例如:申请权限,点击购买,或者点击一个广告。但是恶意应用可以欺骗用户执行这些操作,而且用户却完全不知道。因此针对敏感功能,android提供的是一个触摸过滤机制。开启触摸过滤需要调用view.setFilterTouchesWhenObscured(boolean)或者在XML中设置android:filterTouchesWhenObscured的值为true。此时当视图一旦被其他窗口遮蔽,系统会丢弃视图所收到的触摸事件。因此视图上出现toast或者dialog时,触摸事件一样会被系统丢弃。如果想自定义控制,可重写view.onFilterTouchEventForSecurity(motionEvent)。常用的UI布局1. RelativeLayout关联型布局。可使用相对位置的布局。2. GridLayout表格型布局。3. LinearLayout线性布局。必须要指定是水平还是竖直。UI事件传递事件自上而下传递,ViewGroup计算传递给子View。处理事件顺序相反。Activity是与用户交互,并且带界面的组件。创建activity创建activity分3步骤:1. 继承activity,并实现某些生命周期方法。2. 创建对应的XML视图文件。通过activity.setContentView将视图放入到content中。3. 在manifest文件中声明activity。如下图例子:上图中,黑色框2中的android:name通常是需要全名称(带包名),这里虽然写的是“.ExampleActiviy”,但是包名是在根节点属性“package”中声明,如第一个黑框。褐色框中表示的是该activity是可以通过图标点击进入的。启动activity从activity中启动其他的activity,大体分两种:1. 普通启动:2. 启动并返回结果:并必须实现这个方法来处理返回结果关闭activity首先要说的是activity的生命应该交给系统来管理,但是某些条件下需要我们手动清理此时需要在activity中执行finish方法。注意:在执行finish方法时,只是标记了该activity可以被关闭,但什么时候关闭还是由系统决定,所以清理会有延迟。Activity的生命周期生命周期中的主要方法:1. onCreateactivity创建后会调用该方法。2. onStartactivity将要可以用于显示。3. onResumeactivity已经在最前端显示了。4. onPauseactivity将要失去焦点,也就是不在最前段显示。5. onStopactivity已经不在显示状态。6. onDestroyactivity将要被销毁。Fragment通过fragment可让activity支持动态界面。Fragment不是组件,只能用在activity中。可以简单的看成是“子activity”,目的是让activity支持动态界面。比如根据手机屏幕不同:FragmentA和FragmentB可重用。在不同的activity中组装成不同的页面。Fragment的生命周期如图,其中需要注意的方法onCreate():创建时调用,需要在这里初始化一些fragment所需的内容。onCreateView():当第一次渲染用户界面时候调用。必须返回fragment的根视图。onPause():当失去用户焦点时会执行,可以在这里保存用户操作的状态,方便回显。如何添加到activity中1. XML样式文件中声明:这里与添加普通视图写法一样,但是有一点要注意,fragment必须要有一个唯一标识来区别。这样做的好处是可以让系统缓存该fragment,不需要每次都重新创建新的fragment。Fragment的ID有三种提供方式:a. 使用android:id标签提供唯一IDb. 使用android:tag标签提供唯一字符串c. 如果都没有指定,会使用容器的ID。2. 代码中添加:需要先获取到FragmentManager,然后开启fragment事物,例如;然后在事务中增加fragment并提交事务,例如:其他可通过fragment.getActivity来获取所属的activity。LoaderAndroid3.0开始出现,目的是让activity和fragment异步加载数据更加简单。有以下特点l 每个activity和fragment中都可用l 提供异步加载数据l 监控数据,并在数据改变时会将新的数据给出l 可自动重新连接到loader的游标,无需用户手动保存游标位置。简单使用过程:1. 在activity或者fragment中初始化LoaderManager2. 实现LoaderManager.LoaderCallbacks方法。并在其中创建Loader的方法中创建AsyncTaskLoader。3. 使用SimpleCursorAdapter来显示数据。Service可在后台长时间执行操作,与用户可能有互动,但是没有用户界面的组件。创建Service分2步:1. 继承service,实现生命周期中方法2. 在manifest文件中声明该组件如图:启动Service从activity中启动service分2种方法:1. Start方式:2. Bind方式:生命周期如图,无论是哪种启动方式,onCreate均会执行。但是随着启动方式不一样,后续执行方法不一样。Start方式启动的Service需要在完成工作后自己关闭,或者等待客户端关闭。Bind方式启动的Service需要等待所有的客户端都解除绑定后,会被系统自动关闭。动画Android中动画属于关键帧动画。分3种使用方式:Drawable动画:这是最简单的动画方式。一个接一个的显示静态资源,类似一个胶卷,或者是幻灯片。使用过程如下:a. 在res/drawable/目录下定义一个XML。b. 在XML中使用animation-list作为根节点。里面定义Item元素。例如:如图中所示,每个Item表示一帧,android:drawable表示帧所对应的资源,android:duration表示帧所持续的时间。View动画:在老的系统中,并且只能用于视图的动画。可完成视图的缩放、旋转、透明度、移动。但是需要注意,视图视觉上虽然可能变化,但是相应的属性却并未改变。使用过程如下:a. 在res/anim/目录下定义XML文件b. 在XML中使用alpha,scale,translate,rotate,interpolator,set来做根节点,其中set可包含set。例如:如上图中,android:startOffset是动画的开始延迟,android:duration是动画持续时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商场商户交租合同范本
- 纽约美甲店合伙合同范本
- 家具采购与订购合同标准范本
- 明珠小学1年级数学试卷
- 宣传红色基地活动方案策划(3篇)
- 机电节能施工方案(3篇)
- 陵水县初三二模数学试卷
- 基于财务战略矩阵的江中药业财务战略分析
- 点餐机合同范本
- 师范实习班级活动策划方案(3篇)
- 第1课 鸦片战争 课件 历史统编版2024八年级上册
- 2025年中国冷链物流行业投资前景分析、未来发展趋势研究报告(智研咨询发布)
- 2025合作合同范本下载
- 手外伤急救诊疗流程标准化
- 农村土地托管培训课件
- 老年专科护士学习培训汇报
- 基孔肯雅热防控培训课件
- 公司岗位补助管理办法
- 2025年第十届“学宪法、讲宪法”网络知识竞赛题库(含答案)
- 游戏与儿童发展课件
- 捐赠助学活动方案
评论
0/150
提交评论