android.view.View---中文

View

这个类是描绘块状视图的基类。View会绘制一个包含Drawing是event事件的方形块
View是所有与用户交互的组件的Widgets的基类(Buttons,textField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。

Using Views

Views在界面中被组织成一个单一的树形。可以通过硬编码或则XML文件来增加一个View,View的每个特定的子类可以展示如HTML中Text、images等组件的功能。

当你创建一个View时,下面的方法可能是你最想要实现的:
-Set properties:比如设置TextView的text值,每个组件的属性是不一样的。可以在xml文件中来设置这些属性
-Set focus:框架可以对焦点的移动做出反应。如果想将焦点设置到某个特定的View,可以使用requestFocus()
-Set up listeners:View允许客户端设置监听机制来监听自己,当View上有监听器上感兴趣的事件发生时可以通知客户端来处理。 例如:所有的组件都允许设置在得到和失去焦点的时候通知监听器,
  你可以通过setonFocusChangeListener(View.OnFocusChangeListener)来注册监听器。
  有一些组件有自己特有的监听事件,入Button的Click事件。
-Set visibility:可以通过setVisibility(int)来展示或则隐藏View
特别说明:Android framework负责测绘,定线和绘画Views。一般情况下你不需要重写这些方法除非你想实现一个ViewGroup


Implementing a Custom View

实现一个View,首先需要实现框架中一些所有Views公用的方法。不必重写所有所有的方法,可以仅仅重写onDraw(android.graphics.Canvas)

Category

Methods

Description

Creation

Constructors

There is a form of the constructor that are called when the view is created from code and a form that is called when the view is inflated from a layout file. The second form should parse and apply any attributes defined in the layout file.

onFinishInflate()

Called after a view and all of its children has been inflated from XML.

Layout

onMeasure(int, int)

Called to determine the size requirements for this view and all of its children.

onLayout(boolean, int, int, int, int)

Called when this view should assign a size and position to all of its children.

onSizeChanged(int, int, int, int)

Called when the size of this view has changed.

Drawing

onDraw(android.graphics.Canvas)

Called when the view should render its content.

Event processing

onKeyDown(int, KeyEvent)

Called when a new hardware key event occurs.

onKeyUp(int, KeyEvent)

Called when a hardware key up event occurs.

onTrackballEvent(MotionEvent)

Called when a trackball motion event occurs.

onTouchEvent(MotionEvent)

Called when a touch screen motion event occurs.

Focus

onFocusChanged(boolean, int, android.graphics.Rect)

Called when the view gains or loses focus.

onWindowFocusChanged(boolean)

Called when the window containing the view gains or loses focus.

Attaching

onAttachedToWindow()

Called when the view is attached to a window.

onDetachedFromWindow()

Called when the view is detached from its window.

onWindowVisibilityChanged(int)

Called when the visibility of the window containing the view has changed.

IDs

Views都需要有个ID来确定这个View。
XML文件配置示例:
 <Button
  android:id="@+id/my_button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/my_button_text"/>
代码定位View示例:
 Button myButton = (Button)findViewById("my_button");
View的ID不是必须的,建议在一个查找树中保持它的唯一性

Position

View在系统中展示为一个方形状。View可以通过width,height来定位left和top两个坐标(单位为pixel)
可以通过getLeft()来返回方形的左上角的X值、getTop()来返回方形的左上角的Y值(这里返回的值是相对于父节点左上角的位置)
为了方便,android还提供了getRight(),getBottom()方法来获取方形框的右下脚的坐标。(getRight=getLeft+getWidth)

Size,padding and margins

View视图有两个width和height的值:

一个指的是在父View里所占的大小(通过getMesuredWidth()和getMeasuredHeight()获得)
另一个指View实际的大小的值(通过getWidth()和getHeight()来获得)。两者不限定是否需要相等。
padding值和HTML的一样指内边距,可以通过setPadding(int,int,int,int)来设定以及通过getPaddingLeft(),getPaddingTop()
getPaddingRight()和getPaddingBottom()来获取
View并不提供外边距属性,当时ViewGroup提供这个属性(View.MarginLayoutParams).

Layout:

Layout是一个两步的过程:测绘和布局。测绘是通过measure(int,int)实现的,是一个对View树从上到下的
遍历过程。在递归过程中,向树节点插入自己的尺寸,最后,每个View保存了它的大小。布局是通过layout(int,int,int,int,int,int)实现的,在遍历过程中,每个父节点通过View的大小来布置子View的位置。当视图measure()方法返回时,View和它的子节点的getMeasureWidth()和getMeasureHeight()的值必须设置好了,
这样确保了当测绘结束时,所有的父节点都可以接收其子节点的尺寸数据。一个父级View可能多次调用子View的
measuer()方法。比如,父级View在不指定大小条件下遍历子Views来确定需要多大的尺寸,当所有子Views的尺寸大小
太大或太小时,父级View会再次调用measure()方法来设置实际的值。
 测绘步骤通过两个类来传递尺寸:子类通过View.MeasureSpec类告诉父级类自己的的尺寸和位置,LayoutParams子类
则通过width和height描述了View的的大小。每个维度可以这样定义:
-一个确切的数字
-MATCH_PARENT,子类将覆盖怎个父级(不包括填充值)
-WRAP_CONTENT,子要求大小能覆盖其内容(包含填充值)
不同的ViewGroup子类有不同的LayoutParams子类。
比如,AbsoluteLayout包含了一个含有X、Y值的LayoutParams子类
MeasureSpecs类用于父级向子类传递需求,一个MeasureSpec有三种模式:
-未指定:父级View的大小由子Views决定。比如LinearLayout()通脱调用高度指定为UNSPECIFIED宽度指定为240的
measure()方法时,父级的Height大小由子视图的高度。
-确切的值:父级向子View设置一个确定的值并且确保子类符合这个设定
-最大值:父级向子View设定一个最大值,并且确保子Views符合这个设定
通过requestLayout()初始化一个布局,这个方法一般在视图认为当前约束不能满足其要求时候调用

Drawing

画图的过程是通过遍历树来展示View有效部分来实现的。因为遍历树是有序的,所以父节点优先于
子节点绘制出来,兄弟节点则通过在树中的顺序来展示框架不会在有效区域之外画图,
并且会画好Views的背景。可以通过invalidate()方法来执行绘图。

Event Handing and Threading

视图的生命周期如下:
-当一个事件发生时会被派发到适当的View中,视图处理事件并且通知所有的监听器
-在处理事件的过程中,如果视图的边界发生了变化,那么View会调用requestLayout()方法
-相似的情况下,当视图的可视性发生了变化,那么需要调用invalidate()方法
-不管requestLayout()或则invalidate()方法被调用,框架都会重新测绘和布局,并且在树中合适的地方画上view
注意:整个视图树是在一个线程内处理的,因此调用任何方法时,必须在UI现场内处理,如果其他线程内需要更新
view的视图状态,则需要通过Handler类

Focus Handing

框架会处理常规的焦点移动以应对用户输入作出反应。包括试图移动或隐藏或新视图可见时改变焦点。视图通过
isFocusable()方法提示其是否需要焦点。调用setFocusable(boolean)方法来设置视图是否需要焦点
焦点移动基于一种算法:找到指定方向上最近的邻居。在极少情况下,算法的结果与开发人员期望的不一样。
可以通过在布局文件中设置如下四个属性来明确定义属性指向:nextFocusDown,nextFocusLeft,nextFocusRight
nextFocusUp.要强制一个视图获取焦点,调用requestFocus()方法。

Touch Mode

当用户操作方向键时最好是活的焦点的组件一些动作来提示用户那个组件获得了焦点。当设备拥有触摸功能时,用户
可以通过触摸来选定组件。这个模式叫做"Touch mode".
在一个有触摸能力的设备中,一旦用户触摸了屏幕,设备就会进入到"touch mode"。只有isFocusableInTouchMode()
为true的组件才可以活的焦点,比如editing组件,其他的比如buttons不会获得焦点,它只关心点击操作。
任何时候用户点击了方向键,设备就会退出touch模式而进入到按键模式
可以在Activitys中通过isInTouchMode()方法来确定设备是否在触摸模式中。

Scrolling

框架对期望在内部滚动其内容的视图提供了基本的支持,包括跟踪X和Y的滚动偏移来画滚动条。可通过srolllBy(int,int)
,scrollTo(int,int)和awakenScrollBars()来了解更多细节

Tags

与ID不同,标枪不用来识别视图。标签是可以关联到视图上的额外信息。通常用来方便在视图中存储与视图相关的数据,
而不是存放在独立的结构中。

Animation

通过setCurrentAnimation(Animation)或startAnimation(Animation)把一个动画对象加到View中。动画可以改变View的
比例,旋转,平移以及ALPHA。如果有子视图,则该动画会影响整个视图树。当动画开始,框架负责重画视图,知道动画结束。

Security

大部分时候应用应该可以确认动作所需要的所有内容比如获得访问的权限,购买东西以及点击广告链接。
不幸的是,一些恶意的应用会视图欺骗用户去操作这些动作,用户不经意的就会操作隐藏在view后面的动作。
作为一种补救,框架提供了一种轻的过滤框架来提高比较敏感模块的安全性。
可以通过setFilterTouchesWhenObscured(boolean)或则android:filterTouchesWhenObscured来启用过滤机制。
启用后,框架会在用户启动另外一个view的时候锁定原先的view。比如当有警告,对话或其他视窗在view上面展示时
就不在允许点击view了。
在更小的控制颗粒度下。可以重写onFilterTouchEventForSecurity(MotionEvent)来实现你自己的安全策略。
也可以查看FLAG_WINDOW_IS_OBSCURED.

Constants

int  |GONE    |视图不展示,并且不占用任何布局空间

int  |VISIBLE|视图时可见的

感谢:http://blog.csdn.net/timchen6824/article/details/6228422#

http://developer.android.com/reference/android/view/View.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值