android View的源码解读

来源:互联网 发布:矩阵条件数多大算病态 编辑:程序博客网 时间:2024/05/23 20:39

---------------------------------------此部分为View类的注释部分-------------------------------------------------

本类代表了构建UI组件的基本模块。一个View在屏幕上占用一块矩形区域并且可以负责绘画和事件处理。View 是widgets(被用来构建UI组件)的基类。ViewGroup子类是布局(是一个不可见的容器用来放其他的view或viewgroup并且定义他们的布局属性)的基类。

在window中的所有view是被排放在一颗单一树中的。你可以使用代码或者在一个或多个xml布局中指明一颗view树添加一个view。有许多特定的view子类可以控制或有能力展示文本,图片或者其他的内容。

一旦你已经创建好了一颗view树,有一些通用的属性你可能希望处理:

设置属性:例如设置textview的文本,不同的view子类拥有不同的属性设置。注意,在构建时的那些属性可以在xml布局文件中设置。

设置焦点:框架将处理移动的焦点用来响应用户输入。为了强制聚焦于某个特定的view,调用requestFoucs方法。

设置监听器:view允许客户端设置对本veiw感兴趣的监听器。例如,所有的view允许你设置焦点获得和消失的监听器。你可以使用setFoucsChangeListener注册一个这样的监听器。其他的view子类提供了更多的个性化监听器。例如,Button提供了一个点击时的监听器。

设置可见性:你可以使用setVisibilty隐藏或者显示view。

注意:android框架负责测绘,布局和绘画view。你不应该在你自己的view上调用方法处理这些动作除非你确实实现了一个ViewGroup。

实现一个自定义的View。

为了实现一个自定义的view,你可以通过重写框架在所有view中都会调用的标准方法。事实上,你可以仅仅重写onDraw(Canvas)方法来实现一个自定义的view。

创建,构造器:当view通过代码或xml布局文件被创建时使用的是同一个构造器。使用xml布局文件构建时应该解析并且应用被定义在xml中的属性。

onFinishInflate():当view及其子view全部从xml文件中填充完毕后调用。

布局

onMeasure(int,int):被调用用来定义这个view及其子View请求的尺寸大小。

onLayout(boolean,int,int,int):被调用当这个view应该分配大小和位置给他的所有子view时调用。

onSizeChanged(int,int,int,int):被调用当这个view的尺寸大小改变时。

绘画

onDraw(Canvas):当view渲染他的内容时调用。

事件处理

onKeyDown(int,KeyEvent):当一个新的硬件按键按下事件发生时调用。

onKeyUp(int,KeyEvent):当一个硬件按键弹起事件发生时调用。

onTrackballEvent(MotionEvent):当一个轨迹球事件发生时调用。

onTouchEvent(MotionEvent):当一个触屏手势事件发生时调用。

焦点

onFocusChanged(boolean,int,Rect):当view获得或失去焦点时调用。

onWindowFocussChanged(boolean):当包含在window内的view获取焦点时调用。

依附

onAttachedToWindow():当view依附到window上时调用。

onDetachedFromWindow():当view从window上去除依附时调用。
onWindowVisibilityChanged(int):当包含在window中的view可见性变化时调用。

IDs

views可能有一个与他们关联的整形id。这些ids通常分配在xml文件中,被用来在一颗view树中查找特定的view。

从Activity的onCreate方法中找到特定的view:Button mButton = (Button)findViewById(R.id.my_button);

view ids不需要在树中处处都是唯一的,但是确保他们至少在你正在查找的树的一部分当中是唯一的是一个好的实践。

定位

view的几何形状是一个矩形。一个view有一个定位,用一组left和top坐标表示,和两个纬度,用width和height表示。定位和纬度的单位都是像素。

可以通过方法getLeft()和getTop()取出view的位置。getLeft()返回left或代表矩形view的X坐标,getTop()返回top或代表矩形view的Y坐标。这两个方法返回的都是本view相对于其父view的位置。例如,当getLeft()返回20,意味着本view定位在距离他的直接父view左边缘20像素的右边。

除此之外,一些方便的方法被提供用来避免不必要的计算:getRight()和getBottom。这两个方法返回了view矩形的右边和底边坐标。例如,调用getRight()是等价于getLeft()+getWidth()。

大小,内边距和外边距

一个view的大小使用width和height来表示。一个view实际上拥有两组width和height值。

第一组是measured width和measured height。这两个纬度定义了一个view想要在他的父view布局当中占据多大。这两个值可以通过getMeasuredWidht()和getMeasuredHeight()来获取。

第二组是width和height,或者有时候称为drawing width和drawing height。这两个纬度定义了view在屏幕上正在绘画时和布局之后的实际大小。这两个值可以但不一定和measured width和height不同。这两个值可以通过getWidht()和getHeight()获取。

为了测量他的纬度,一个view需要考虑他的padding。padding使用像素表示view的左上右下部分。Padding可以通过指定一些像素来偏移view的内容。例如,2个left padding将推动内容从左边缘向右移动2个像素。Padding可以通过setPadding(int,int,int,int)或setPaddingRelative(int,int,int,int)设置,并且通过getPaddingLeft(),getPaddingTop(),getPaddingRight(),getPaddingBottom(),getPaddingStart(),getPaddingEnd()获取。

尽管一个view可以定义padding,但是没有提供任何关于margin的支持。然而,viewgroup提供了这样一个支持。连接ViewGroup和ViewGroup.MarginLayoutParams获取更多的信息。

布局

布局分为两个步骤:一个测绘步骤和一个布局步骤。测绘在measure(int,int)中实现,并且是自顶到下遍历整颗view树。每一个view在递归期间向树的下方推送指定的纬度。在测量结束时,每一个view已经存储了他自己的纬度值。第二个步骤发生在layout(int,int,int,int)中,并且也是自顶向下的。在这个步骤当中,每一个父view负责使用传递进来的在measure中计算好的大小定位所有他的子view。
当一个view的measure方法返回的时候,他的getMeasureWidth()和getMeasureHeight()连同view的所有后代的这些值一定已经被设置好了。此处不知如何翻译......?


0 0
原创粉丝点击