View 相关介绍

来源:互联网 发布:电子商务专用软件 编辑:程序博客网 时间:2024/05/20 20:02

View 简单介绍

View是Android显示用户交互界面最基本的模块;它在界面上占据一块矩形区域,它在该区域内进行绘图和事件处理操作; View是一个类,它是所有widget父类,这里的widget可以创建交互的界面组件,比如文件,按钮等。View有一个直接子类叫ViewGroup,它是所有布局的父类;布局。布局是一个容器,它可以盛装其它的View(比如TextView,Button等den),它会占内容但是不可见;就像是一个透明的玻璃容器,里面可以盛装多个widget。布局不仅可以装载widget,而且也可以设置本身或者widget的一些属性(比如背景、位置等)。

简单来说View就是一个显示在界面上一个矩形区域,我们可以在这个矩形区域内显示各式各样的内容,操作不同的事件。这里事件一般指的就是点击、长按、拖动等操作。

Window 简单介绍

我们所看到的内容都是要依附在Window上,这个Window对象我们可以类比Windows 系统中window。Window可以看做一个View的管理器,它主要用来管理最顶层的View视图,这里的最顶层View就是指我们可以看到的View。它提供了一套标准的UI显示策略,一般我们无需去管View显示的策略,Window都帮我们搞定了,比如背景、标题区域等。

Window 是一个抽象类,它只有一个实现类android.view.PhoneWindow。这个类是对外隐藏的,如果想看到必须去下载Android 源码。在源码中绝对位置在com.android.internal.policy.impl.PhoneWindow

我们都知道Activity要把我们指定View/布局文件显示,需要调用setConentView方法;我们去扒一下源码就会发现,这个方法实际上就是调用的Window的setContentView,源码如下:

/** * Set the activity content from a layout resource.  The resource will be * inflated, adding all top-level views to the activity.   // ***省略若干注释*** */public void setContentView(@LayoutRes int layoutResID) {    getWindow().setContentView(layoutResID);    initWindowDecorActionBar();}/** * Set the activity content to an explicit view.  This view is placed * directly into the activity's view hierarchy.  It can itself be a complex * view hierarchy.   // ***省略若干注释*** */public void setContentView(View view) {    getWindow().setContentView(view);    initWindowDecorActionBar();}

通过源码和注释,我们可以很清楚的看到Window就是管理最上层的View视图,而Activity通过Window的setContentView将视图显示到Activity上。至于其它细节有兴趣的同学可以再扒一下源码。

Window管理的所有的View,都会按照一定顺序存放在一个View树中。我们可以通过Java代码动态的添加View,也可以通过xml布局指定一个或者多个布局文件。简单地说只要显示的View都会统一加入到一个View树中,我们可以通过Java代码动态往该View树中添加View,也通过布局指定一些布局文件添加到这个View树中。

View的一般操作

只要了解过Android开发的同学应该知道Android已经提供了各式各样的View供我们在开发中使用;比如显示文本,显示图片或者其它内容。如果我们需要往界面上显示内容,也就是说我们需要新建一个View树,一旦这个View树创建,一般都会做以下的几个步骤:

  • 设置属性:例如设置View的显示文本或者图片,View的显示的位置等,在不同的控件中我们设置的属性也不尽相同。这些属性必须是可以xml布局中可以通过编译的。
  • 设置焦点:Android框架一般会自动处理焦点以响应用户的交互操作,当然我们也可以通过diao’yong调用requestFocus()去请求焦点。
  • 设置监听:View允许我们设置某些事件的监听,当该View的事件触发时我们就会接收到通知,比如我们需要一个点击事件的监听,我们就可以通过 view.setOnClickListener 注册一个监听器,当该View接收到用户手指的点击时,该事件就会触发。
  • 设置可见性:如果需要我们可以设置某个View是否可见。在Java代码中使用setVisibility(int),在布局中使用android:visibility=”[gone]|[visible]|[invisible]”(中括号中的值任选其一)。

注意:Android框架会自己去处理 测量 、 布局 、 绘制 这三个步骤,我们不能直接通过View自己去调用这几个方法;我们只能通过集成View/ViewGroup 去重写这些方法,来实现自己的操作。

View的生命周期方法

当我们去继承一个View/ViewGroup时,我们可以通过重写View/ViewGroup的方法,来达到我们的特殊需求;这就是自定义控件。当然我们自定义控件时,不必重写全部的方法,只需要重写我们需要的就OK。常用的一般有三个方法 onMeasure(int, int)、onLayout(boolean, int, int, int, int)、onDraw(android.graphics.Canvas);当然其它的方法我们应该也了解一下,下面就是一些简单介绍,由于方法挺多,我们根据类别介绍。

  • 创建

    • 构造方法:通常每个控件都会有多个构造方法;如果在代码中创建该控件会用到包含一个Context的构造;如果需要布局中使用,则必须使用带有AttributeSet参数的构造。其它的还有带有主题的构造。
    • onFinishInflate():当一个View和它的所有子View从布局文件中inflate完成后调用。
  • 布局

    • onMeasure(int,int):测量当前View 和它的子View的需要的尺寸大小
    • onLayout(boolean,int,int,int,int):给当前View的所有的子View 分配尺寸大小和位置
    • onSizeChanged(int,int,int,init):当前View的尺寸发生变化时调用
  • 绘制

    • onDraw(Canvas):当View需要渲染内容时调用(将我们需要的内容画到view时调用)
  • 事件处理
    • onKeyDown(int,KeyEvent):当前键盘(物理键)上某个键按下时调用
    • onKeyUp(int,KeyEvent):当按下的键弹起时调用
    • onTrackballEvent(MotionEvent):当轨迹球发生运动时调用
    • onTouchEvent(MotionEvent):当触摸事件发生时调用
  • 焦点
    • onFocusChanged(boolean,int,Rect):当焦点发生变化时调用(这里变化包括获取到焦点和失去焦点)
    • onWindowFocusChanged(boolean):包含当前View的Window的焦点发生变化时调用(这里变化包括获取到焦点和失去焦点)
  • 附着
    • onAttachedToWindow():当View附着到Window上时调用
    • onDetachedFromWindow():当View从Window上分离时调用
    • onWindowVisibilityChanged(int):包含当前View的Window的可见性发生改变时调用

大概就上面的这些方法,这些都是官方文档上提及的;不过除了上面的几种方法,还有例如像onVisibilityChanged(View,int),onScrollChanged(int,int,int,int)等方法也有可能会用到。关于它们的调用次序,如下图(该图来自于Android自助餐之View生命周期):

View的声明周期调用次序

其中文中大部分内容来自于 Android官网的 View类介绍的前半部分,这里做了翻译并添加了一些自己的理解。

0 0