四、界面编程(一) View的基础知识及架构详解

View虽然不属于四大组件,但是它的作用堪比四大组件,甚至比Receiver和Provider的重要性都更大。本文将介绍View的基础知识、常用概念、测量绘制简介等内容,通过这些内容的理解,可以更深入的了解View,也为更复杂的内容做下铺垫。
摘要由CSDN通过智能技术生成

  View虽然不属于四大组件,但是它的作用堪比四大组件,甚至比Receiver和Provider的重要性都更大。本文将介绍View的基础知识、常用概念、测量绘制简介等内容,通过这些内容的理解,可以更深入的了解View,也为更复杂的内容做下铺垫。

View的基本认识及布局架构

  首先,什么是View呢?View是一种界面层控件的抽象,是Android中所有控件的基类,不论是简单的Button和TextView还是复杂的RelativeLayout和ListView,它们共同的基类都是View。

  Android中的每个控件都会在界面中占得一块矩形区域,通常我们会将控件分为两类,即ViewGroup控件和View控件。ViewGroup控件,顾名思义,指的是控件组,也就是一组控件,意味着ViewGroup内部包含了许多个View控件。在Android的设计中,ViewGroup继承了View,也就是意味着View本身就可以是单个控件或者是由多个控件组成的一组控件。ViewGroup控件作为父控件可以包含多个View控件,并管理其包含的View控件。通过ViewGroup,整个界面上的控件形成了一个树形结构,即控件树,上层控件负责下层子控件的测量与绘制,并传递交互事件。通常使用的findViewById就是在控件树中以树的深度优先遍历来查找对应元素。在每棵控件树的顶部,都拥有一个ViewParent对象,这就是整棵树的控制核心,所有的交互管理事件都由它来统一调度和分配,从而可以对整个视图进行整体控制。View树结构如下图:
这里写图片描述

  通常情况下,在Activity中使用了setContentView( )方法来设置一个布局,调用该方法之后,布局内容才真正地显示出来。那么setContentView方法做了什么呢?首先,来看一下Android界面的架构图:
这里写图片描述

  在Android界面的架构图中,我们可以看到,每个Activity都包含一个Window对象,在Android中Window对象通常由PhoneWindow来实现。PhoneWindow将一个DecorView设置为整个应用窗口的根View。DecorView是一个应用窗口的根容器,它本质上是一个FrameLayout。DecorView有唯一一个子View,它是一个垂直LinearLayout,包含两个子元素,一个是TitleView(ActionBar的容器),另一个是ContentView(窗口内容的容器)。关于ContentView,它是一个FrameLayout(android.R.id.content),我们平常用的setContentView就是设置它的子View。通过以上过程,我们可以建立一个标准视图树,如下图:
这里写图片描述

  视图树的第二层装载了一个LinearLayout,作为ViewGroup,这一层的布局结构会根据对应的参数设置不同的布局,如最常用的布局——上面显示TitleBar下面是Content这样的布局。
  用户可以通过设置requestWindowFeature(Window.FEATURE_NO_TITLE)来设置全屏显示,视图树中的布局就就只有Content了,这就解释了为什么调用requestWindowFeature()方法一定要在调用setContentView()方法之前才能生效的原因了。
  在代码中,当程序在onCreate()方法中调用setContentView()方法后,ActivityManagerService会回调onResume()方法,此时系统才会把整个DecorView添加到PhoneWindow中,并让其显示出来,从而最终完成界面的绘制。

View的常用概念

View的位置参数

  View的位置主要由它的四个顶点来定义,分别对应与View的四个属性:top、left、right、bottom,其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标,这些坐标都是相对于View的父容器来说的,它是一种相对坐标。在Android中,x轴和y轴的正方向分别是向右和向下。所以View的坐标和父容器关系如下所示:
这里写图片描述

  根据图中所示,View内有四个成员变量,分表代表了Top、Left、Right、Bottm的值,所以我们可以利用View的get方法获取这些值:

int left = View.getLeft();
int top = View.getTop();
int right = View.getRight();
int bottom 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值