Android自定义控件解析.doc_第1页
Android自定义控件解析.doc_第2页
Android自定义控件解析.doc_第3页
Android自定义控件解析.doc_第4页
Android自定义控件解析.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/Android自定义控件解析Android中,控件大抵被分为两类,即ViewGroup控件取View控件。ViewGroup控件做为女控件能够包括多个View控件,并治理其包括的View控件。 Android控件架构Android中,控件大致被分为两类,即ViewGroup控件与View控件。ViewGroup控件作为父控件可以包含多个View控件,并管理其包含的View控件。通常在Activity中使用的findViewById()方法,就是在控件树中以树的深度优先遍历来查找对应元素。View树结构:UI界面架构图:PhoneWindow将一个DecorView设置为整个应用窗口的根View。DecorView将要显示的具体内容呈现在了PhoneWindow上,这里面的所有View的监听事件,都通过WindowManagerService来进行接收,并通过Activity对象来回调相应的onClickLisener。在代码中,程序在onCreate方法调用setContentView方法后,ActivityManagerService会回调onResume方法,此时系统才会把整个DecorView添加到PhoneWindow中,并让其显示出来,从而完成界面的绘制。View的测量Android在绘制View前,也必须对View进行测量,即告诉系统该画一个多大的View。这个过程在onMeasure方法中进行。Android给我们提供了一个设计短小精悍却功能强大的类MeasureSpec类,通过它来帮助我们测量View。MeasureSpec是一个32位的int值,其中高2位为测量的模式,低30位为测量的大小,在计算中使用位运算的原因是为了提高并优化效率。在onMeasure方法里判断如果当前控件是一个普通的View那么直接调用setMeasureDimension方法设置本控件的大小,如果是一个ViewGruop那么遍历所有的子控件,分别执行子控件的onMeasure方法,最后执行当前自己的setMeasureDimension方法onMeasure方法:父控件传递给子控件的“建议”尺寸大小,两个参数表示宽高大小及测量模式(MeasureSpec类介绍及使用详解)。如果是ViewGroup,且大小为Wrap_content时,则需要遍历所有子View测量他们的大小,然后设置自身的大小。protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) super.onMeasure(widthMeasureSpec,heightMeasureSpec);setMeasureDimension方法:将测量后的尺寸传递给子控件,完成测量工作。protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) setMeasureDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec);ViewGroup的子View位置设定在ViewGrope及其子View完成测量之后,需要对子view进行放置位置的设定。在放置子view前,需要确定整个vewGroup的高度。然后在OnLayout方法中遍历调用子view的layout方法设定具体位置。View的绘制过程:重写onDraw(),在Canvas对象上绘制图形。Canvas为系统2D绘图API必须要使用的对象。canvas通常会带有一个bitmap参数,用于存储绘制在canvas上的像素信息。当创建了含有bitmap的canvas对象后,所有canvas.drawxxx方法都发生在这个bitmap上。值得注意的是,view的onDraw方法中会创建两个bitmap,并将第二个bitmap封装到另一个canvas对象中,只在第二个bitmap上进行绘图。ViewGroup的绘制:如果没有设置背景色,不会调用onDraw方法,而是调用dispatchDraw方法绘制子View。原理也是遍历子view并调用其绘制方法。自定义View自定义View通常需要重写onDraw方法来绘制自定义内容。如果设置了wrap_content属性,那么必须重写onMeasure方法测量大小。View中有一些重要的回调方法:1、onFinishInflate():从XML加载组件后回调2、onSizeChanged():组件大小改变时回调3、onMeasure:测量4、onLayout():回调该方法来确定显示的位置5、onTouchEvent():监听到触摸事件回调实现自定义控件的三种方式A、对现有控件进行拓展Overrideprotected void onDraw(Canvas canvas) /父类绘制之前,实现自己的效果super.onDraw(canvas);/父类绘制完成后,再实现自己的效果B、通过组合来实现新的控件自定义属性命名控件 介绍C、重写View来实现全新的控件 事件拦截机制几个重要的方法:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent.从ViewGroup到view的事件分发和处理回调事件顺序如下(以ViewGroupA,ViewGroupB,view为例):ViewGroupA.dispatchTouchEvent ViewGroupA.onInterceptTouchEvent ViewGroupB.dispatchTouchEvent ViewGroupB.onInterceptTouchEvent view.dispatchTouchEvent view.onTouchEvent ViewGroupB.onTouchEvent ViewGroupA.onTouchEvent解释:1、dispatchTouchEvent方法用于分发事件,一般不用重写。onInterceptTouchEvent用来拦截TouchEvent,onTouchEvent用来处理TouchEvent。2、onInterceptTouchEvent返回true则拦截事件,不往下分发;onTouchEvent返回true则不往上回调。这里有一个很好的盒子可以帮助大家好更好的理解这些事件的传递。用四个角色分别代表四个类:总统 - MyActivity省长 - MyFrameLayout市长 - MyLinearLayout农民 - MyTextView【举个通俗易懂的例子】:总统对省长说:我要吃红烧鱼省长对市长说:你做个红烧鱼市长对县长说:你做个红烧鱼县长对农民说:你做个红烧鱼(农民做呀做,没做出来)农民说:我尽力了,但真心不会做呀,饶了我吧县长说:你个笨蛋,下次不找你了,看我来做(县长做呀做,没做出来)县长对市长说:我尽力了,非常抱歉,我不会做市长说:你个废物,要你何用,只能我自己来做了(市长做呀做,做成功了)市长对省长说:红烧鱼做好了省长说:不错,下次有事还找你省长对总统说:红烧鱼做好了总统说:不错,下次有事还找你-总统对省长说:我要吃水煮鱼省长对市长说:你做个水煮鱼市长说:县长连红烧鱼都搞不定,这次就不找他了,我自己亲自来做(市长做呀做,又成功了)市长对省长说:水煮鱼做好了省长说:不错,下次有事还找你省长对总统说:水煮鱼做好了总统说:不错,下次有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论