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完成后调用。
- 构造方法:通常每个控件都会有多个构造方法;如果在代码中创建该控件会用到包含一个Context的构造;如果需要布局中使用,则必须使用带有
布局
- 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生命周期):
其中文中大部分内容来自于 Android官网的 View类介绍的前半部分,这里做了翻译并添加了一些自己的理解。
- Android View相关介绍
- View 相关介绍
- 状态栏显示相关View Flag参数介绍
- View相关
- android.view.View 相关
- View 介绍
- android.view.View属性介绍
- android view相关使用
- Android View 相关
- View属性相关强化
- View相关知识笔记
- 自定义view相关学习
- View的相关问题
- 自定义View相关API
- View相关知识
- View相关知识点
- View相关的计算
- View面试相关
- iOS开发自动布局代码篇NSLayoutConstraint
- Dashgo-D1 带陀螺仪的建图导航
- Android Apk 文件反编译和重新打包的过程分析
- [LeetCode]138. Copy List with Random Pointer
- Subversion简明手册--使用hook svn (事件处理)
- View 相关介绍
- 【BZOJ 4199】[Noi2015]品酒大会 后缀自动机构造后缀树+dp
- javascript中的正则表达式
- 仿射变换&透视变换
- eclipse无法进入调试程序
- 编译安装vim-8.0 (centos)
- 关于服务器operating system not found的一些问题
- JVM如何判断一个Java对象是否可以回收
- ZooKeeper分布式环境部署