您的位置:首页 > 移动开发 > Android开发

有关android.view.View

2016-02-22 12:07 253 查看


有关android.view.View

 (2011-09-16 17:19:26)

android.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)

-------------------------------------------------------------------------------------

Creation  |Constructors   |可以在代码中创建View时候调用这个构造函数

          |               |或则在XML文件中配置了这个View的时候创建,

          |               |XML形式是包含了所有XML中定义的属性

          ----------------------------------------------------------------------------          |onFinishInflate()  |当XML中View节点所有子节点都创建好的时候调用的

---------------------------------------------------------------------------------------

Layout    |onMeasure(int,int) |用来确定View和它所有子类的大小

          ------------------------------------------------------------------------

          |onLayout(boolean,int,int,int,int)|用来设定所有字节点的大小和位置

          ------------------------------------------------------------------------

          |onSizeChanged(int,int,int,int) |当节点的大小变化时候调用

---------------------------------------------------------------------------------------Drawing   |onDraw(Canvas)   |当节点需要给它的内容着色的时候调用

---------------------------------------------------------------------------------------

Event     |onKeyDown(int,KeyEvent) |当有按键按下发生时候调用

  ------------------------------------------------------------------------

Processing |onKeyUp(int,KeyEvent)  |当有按键松开始调用

          ------------------------------------------------------------------------

           |onTrackballEvent(MotionEvent) |当有轨迹事件发生时候调用

          ------------------------------------------------------------------------

           |onTouchEvent(MotionEvent) |当触摸屏幕的事件发生时候调用

---------------------------------------------------------------------------------------

Focus      |onFocusChanged(boolean,int,Rect)|当View得到或则失去焦点时候调用

---------------------------------------------------------------------------------------Attaching  |onAttachedToWindow()  |当View被添加到window中时调用

          ------------------------------------------------------------------------

           |onDetachedFromWindwo()  |当View从window中删除时候调用

          -----------------------------------------------------------------------           |onWindowVisibilityChanged(int) |当包含该View的window可见性发生变化的时候调用

----------------------------------------------------------------------------------------
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()方法来获取方形框的右下脚的坐标。

Size,padding and
margins
View视图有两个width和height的值:一个指的是在父View里所占的大小(通过getMesuredWidth()和getMeasuredHeight()获得)

另一个指View实际的大小的值(通过getWidth()和getHeight()来获得)。两者不限定是否需要相等。

padding值和HTML的一样指内边距,可以通过setPadding(int,int,int,int)来设定以及通过getPadding
4000
Left(),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|视图时可见的

interfaces
public
static interface OnClickListener:用于响应View的点击事件

public Methods
abstract void onClick(View v):处理点击事件的方法。

 
http://blog.sina.com.cn/s/blog_67abf5570100xi6d.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: