Android图形用户界面开发之ViewTree和DecorView详细介绍

作者:小菜 更新时间:2025-03-16 点击数:
简介:图形用户界面(GUI)是Android应用程序开发不可或缺的一部分。

其不仅能为用户提供输入,还能够根据(用户)执行的动作,提供相应的反馈。

因此,作为开发人员,能

【菜科解读】

图形用户界面(GUI)是Android应用程序开发不可或缺的一部分。

其不仅能为用户提供输入,还能够根据(用户)执行的动作,提供相应的反馈。

因此,作为开发人员,能够理解UI(用户界面)是如何创建以及跟新的,就显得尤为重要。

ViewTree

View 和 ViewGroup 是Android UI的基本组件, 而ViewGroup作为容器,可以包含一组View, 并且ViewGroup其本身就是View的扩展。

看源码:

public abstract class ViewGroup extends View implements ViewParent, ViewManager{}

而各种不同的Widgets 像TextView, Button 等等 也是View的扩展,只不过是放在各种Layout里,比如LinearLayout,RelativeLayout。

而Layout却是ViewGroup的子类。

所以说一个ViewTree只不过是各种Views和ViewGroups放在一个Layout里组成的树形结构。

有例子才有真相。

通过eclipse的Outline窗口,我们可以看下下面这个树状布局。

XML Code:

?xml version="1.0" encoding="utf-8"?>

当我们在Activity里,用setContentView()去设置这个view,然后运行,我们可以看到如下图:

仔细观察XML文件,以及页面渲染的View,我们会发现:

1. ViewTree 是以一种自上而下的方式进行遍历实现。

2. Parent总是最先绘制的,其实才是Children,并且仍然遵循自上而下的方式。

所以在我们的例子中,RelativeLayout是最先绘制,接着是其孩子WhiteView,RedText 等等,

直到最终GrayView绘制,并且我们会看到后绘制的覆盖了部分先绘制的。

为了更方便观察这些Views是怎么绘制的,我们把手机屏幕看作下面的X,Y,Z的坐标系。

屏幕的左上角作为[0,0,0],X轴向右,Y轴向下沿着屏幕的长度,Z轴延伸出屏幕。

所以说,当我们遍历Tree的时候,这些Views基本上就是沿着Z轴排放。

这里需要注意,当View有部分被遮挡时,Android就不会再绘制这被遮挡的部分。

比如上图,灰色遮挡部分红色,Android绘图机制就不会再绘制那部分红色,所以我们看到的是直接遮挡,而不是颜色的混合。

现在我们知道了我们在XML里定义的Views是如何绘制的了,但是这还不够,我们可以借助一个非常有用的工具Heirarchyviewer去更深层细的观察页面布局。

Heirarchyviewer 在文件夹android-sdk/tools下,在命令行下找到这个文件夹,然后执行heirarchyviewer.bat 就可以了。

下图是Hierarchy Viewer的截图:

在Hierarchy Viewer里,列代表树的深度,而每一列里行的数量则表示每一层的深度。

从图上我们能注意到RelativeLayout并不是Root级别的,而是id为content的FrameLayout的一个子元素。

而实际山我们调用setContentView(View v)里的View v 就是这个content视图。

现在注意下跟content同级的FrameLayout有个子TextView,实际上它既是Activity的titleBar。

那么我们删除这个TitleBar之后,View Tree又会变成什么样子呢?

方法:在manifest文件,然后修改application的主题如下:

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

这样再打开Hierarchy Viewer,我们就能看到下图:

(注意:本人选用的Android是2.2的,要是用4.1的话,并不能得到下图,中间还会多一个Id为action_menu_bar_stub的ViewStub)

这时候我们看到content FrameLayout的父元素是PhoneWindow$DecorView。

DecorView

我们知道在Android中抽象类Window定义了最上层窗口的基本外观以及基本行为,她的实例将会被加到WindowManager中,提供一些标准的UI策略,像Background,Titlebar,以及Default key processing等等,当然这些属性是可以通过WindowManager.LayoutParams定制的。

而上面提到的PhoneWindow是Window抽象类的唯一实现,即android.policy.PhoneWindow。

而DecorWindow是PhoneWindow的一个私有内部类,其实就是一个FrameLayout的扩展。

private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {}

就是这个类构成了最上层应用程序视图。

根据我们在Manifest中设置的Theme或者在PhoneWindow设置的Flags,来确定DecorView的Layout。

所以在我们的例子中,第一张中我们有个简单的主题(在Manifest中)包含一个titlebar和contentview,于是PhoneWindow就生成了包含Title的LinearLayout,以及放置content的FrameLayout。

而在第二张图中,我们去掉了titlebar主题,所以她就只生成了包含FrameLayout的DecorView了。

结论

最后我们来总结下,当一个Activity被启动的时候,这个视图树(View Tree)大体是如何创建的呢:

1. PhoneWindow根据Manifest的主题或者是特定的PhoneWindow设置去生成一个DevorView的布局,作为跟视图(Root View)。

2. Activity调用setContentView()方法把用户自定义的Layout XML文件作为内容视图(Content View), 当然其内部是调用PhoneWindow的setContentView()方法。

3. 经过上两步,UI视图就已经形成了,那么当UI每次被刷新的时候,View Tree就会像上面所说的那样被Traverse。

Android,图形,用户界面,开,发之,ViewTree,

android版最新凯立德冬季地图

前往凯立德专题 过年了方便一下大家的出行,从网上搜集到的一个 android版的凯立德。

【运行环境】:Android(安卓)【版本信息】:C2025-C7802-2721W09该版本除了支持主流的800*480分辨率外,经测试还支持320x240、240x400、480x320、800x480、850x480、960x540、960x640等常见到的一些分辨率,甚至平板电脑1024x600、1024x768、1280x720、1280x800的分辨率,更多分辨率支持情况请自行测试。

800X480分辨率以上的手机都可以用。

凯立德 全3D完整版 全3D的触控体验,离线语音导航,免激活,新的配套程序。

机车版更适合驾车出行的你。

经本人国行小V测试完美运行,以下提供的都是(整包)迅雷下载地址,一次下载一次解压一次安装为你省时间,此为最新版本,请将原来老的地图包及主程序全部删除后重新安装。

同一版本的地图可共用,不用重复下载。

凯立德秋季P2038-X5B04-2621W09 PND版本的下载地址 下载地址(迅雷整包): http://kuai.xunlei.com/d/QKHVBQKWVIZL 内含最新的2621W09全3D完整版地图和主程序(解压密码:www.xxkwz.cn 去掉),解压后的NaviOne文件放在SD根目录下安装里面的主程序即可,里面的主程序是(P2038-X5B04 )可选下面的主程序(C2025-C7802)。

解压后大概2.8G左右. 此主程序(C2025-C7802)安装后显示的是凯立德图标不再是移动导航了,本人觉得好用,其它主程序自己上网搜在此就不提供了,理论上是支持步行的,: 下载地址: http://115.com/file/be8rktgn# 凯立德车机黑版C2025-C7802低速刷新车标.apk最新凯立德冬季 C2025-C7802-2721W09 3D 机车完整版下载地址(迅雷整包):http://kuai.xunlei.com/d/QZWBHPJMMBZV 内含最新版冬季2721W09完整地图(解压密:www.xxkwz.cn)解压后的NaviOne文件夹放在SD根目录下安装主程序(C2025-C7802)既可。

上面提供下载。

凯立德最新冬季版M2342-D5A04-2721J09 2D 手机完整版 下载地址(迅雷整包):http://kuai.xunlei.com/d/QVDSAHFZSIPQ 内含最新的2721J09完整地图,解压(解压密:www.xxkwz.cn)后的NaviOne文件放在SD根目录下安装里面的主程序(M2342-D5A04)即可. 该版本除了支持主流的800*480分辨率外,经测试还支持320x240、240x400、480x320、800x480、850x480、960x540、960x640等常见到的一些分辨率,甚至平板电脑1024x600、1024x768、1280x720、1280x800的分辨率,更多分辨率支持情况请自行测试。

另外普及一下凯立德是分PND手持,Car车机版和M手机版。

大家看版本号最前面的字母就知道区别了,P版是清新的绿色界面,C版是酷酷的黑色界面,M版是手机专用。

j09和w09的区别是:J开头的是普通版,W开头的是3D版。

大家根据自己的需求选择吧。

关于有些机油安装凯立德出现配置文件不存在的问题本人也在这里一并解决,把后面这个下载后解压覆盖在NAVIONE文件下既可,凯立德配置文件.rar 没有声音的下这个补丁覆盖就行了:凯立德声音补丁 http://115.com/file/be8rtljg android,版,最新,凯,立德,冬季,地图,前往,凯,

苹果MAC电脑安装Androidsdk图文教程

苹果系统已经用习惯了,所性不用windows平台下开发了,就想到在苹果平台上安装这么一个SDK,总结下大概的过程如下:1.首先应该准备好mac平台的eclipse,在http://www.eclipse.org/downloads/里找到适合的版本(在此,我选3.5),并解压安装;2.下载mac版本的android sdk http://www.cr173.com/soft/35098.html,解压到指定的目录(其实这个只是个SDK与AVD配置的管理软件);3.安装Fastboot for Mac OS插件,这个最难找了.不过还是有一个地址可以下载的http://pan.baidu.com/s/1i3id10Tfastboot是刷系统ROM的一种工具,刷系统img和射频img;另一种工具是adp。

4.下载完成后将 Fastboot 复制到 /androidsdk/tools 目录下(如果SDK包中包含 fastboot,可跳过此步骤)打开终端,输入下面的命令来创建一个新的 .bash_profile 文件[xhtml]view plaincopypico.bash_profile在新出现的修改提示中输入[c-sharp]view plaincopyexportPATH=$PATH:/AndroidSDK/tools按“control+X”保存(确认按“Y”),然后退出并重启终端,至此,Mac OS X 下就可以使用 Adb 和 Fastboot 工具了.本来说是还要需要安装ADB的,但是在tools目录下已经有了,省事,跳过.5.打开tools目录下的android,进行下载和配置SDK版本及AVD.6.到eclipse升级里输入 [c-sharp]view plaincopyhttps://dl-ssl.google.com/android/eclipse/ 安装ADT Plugin,使得刚才所装的SDK能与eclipse相结合;:7.开始创建HelloWorld,哈哈.个人认为,在Max OS下搭建Android SDK不需要Fastboot。

eclipse+adp,就可以了。

呃,我就是MAC下开发ANDROID的,只需要eclipse+adp就OK,比在LINUX下还要简单 苹果,MAC,电脑,安装,Androidsdk,图文,教程,

加入收藏
               

Android图形用户界面开发之ViewTree和DecorView详细介绍

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录