原文链接: http://www.cnblogs.com/melaniedeng/archive/2012/05/17/2506869.html

做Android应用的人都知道,要一个apk适用多个不同的手机屏幕是很容易的,就是在项目的res文件夹下面有多套相关的资源文件。程序运行的时候,Android系统会根据当前设备的信息去加载不同文件夹下的资源文件。但是Android系统是怎么做到这一点的呢?上网上搜了一下,很少有这方便的介绍,只好自己研究下代码了。下面是我研究代码得到的结果(正确性有待确认),在这里分享一下。

这里以ICS上在Activity的onCreate()方法里面调用setContentView(int resourceID)为例,介绍一下系统如何根据我们的id(R.layout.xxxx)找到合适的layout文件进行解析加载:

如果你的res下面有三种不同的layout:layout, layout-sw480dp和 layout-sw600dp,这里的sw<N>dp表示这个layout文件夹下面的布局文件只有在设备短边的最小宽带为N时才加载。你的设备是800x480的分辨率,那么这个apk安装在你的设备上就会加载 layout-sw480dp里面的布局文件。下面是framework的java层调用链:

Activity.setContentView(int resourceID) -> PhoneWindow.setContentView(int resourceID) -> LayoutInflater.inflate(int resource, ViewGroup root) -> LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot) -> Resources.getLayout(int id) -> Resources.loadXmlResourceParser(int id, String type) -> Resources.getValue(int id, TypedValue outValue, boolean resolveRefs) -> AssetManager.getResourceValue(int ident, int density, TypedValue outValue, boolean resolveRefs) -> AssetManager.loadResourceValue(int ident, short density, TypedValue outValue, boolean resolve)

在上面的掉用链中:

1. 最后加载的是哪个xml是由Resources.getValue(int id, TypedValue outValue, boolean resolveRefs)调用完成之后的outValue.string决定的,因为outValue.string的值就是你的资源文件的具体路径,如:

  1) xxx/values/xxx.xml

  2) xxx/layout-sw600dp/xxx.xml

2. AssetManager.loadResourceValue()调的是frameworks/base/core/jni/android_util_AssetManager.cpp里面的native方法, 如何获得正确的outValue值,在native方法俩面主要有以下几步:

  1) 调用frameworks/base/libs/utils/ResourceTypes.cpp 的ResTable::getResource(),遍历所有资源文件

  2) 在ResTable::getResource()里面调用ResTable::getEntry()来确定资源文件来自哪个entry,即layout,或者layout-sw<N>dp,由此可见,ResTable::getEntry()是我们这个问题的关键

  3) 在ResTable::getEntry()里面:

    a) 首先获取本设备的configurion信息,屏幕分辨率,屏幕大小,locale,横竖屏等。

    b) 根据得到的本设备的configurion信息,过滤掉不适应本设备的entry,比如设备是800x480的,那么超过此分辨率的资源(例:layout-sw600dp)就要被过滤掉,实现在frameworks/base/include/utils/ResourceTypes.h中ResTable_config的match函数中

    c) 对过滤后的resource进行最佳适配,找到最符合的entry文件。因为之前已经将不符合的,即大分辨率的entry已经被过滤掉了,所以这里就找剩下的最大的就是最佳适配的。实现在frameworks/base/include/utils/ResourceTypes.h中ResTable_config的isBetterThan()函数中。

3. 我做了一个尝试,就是想让800x480分辨率的设备上的应用都加载 layout-sw600dp里面的资源文件。所以将上面b)步骤的frameworks/base/include/utils/ResourceTypes.h里面ResTable_config的match函数改动如下:

?
/*if (smallestScreenWidthDp != 0
              && smallestScreenWidthDp > settings.smallestScreenWidthDp){
          return false;
}*/
if (smallestScreenWidthDp != 0
              && smallestScreenWidthDp > 600) {
          return false;
}

我将settings.smallestScreenWidthDp强制换成了600,这样的话,所有比600dp小的(包含600)在内的资源文件在做过滤时就被保留了下来,而c)步骤不做检查,只找最大的,所以layout-sw600dp就成了系统认为的“最合适”的资源问价了。

将重新编译frameworks/base/libs/utils/生成的lib库push到/system/libs下面,再重启手机,然后启动上述应用,就可以了看见程序加载的layout-sw600dp的ui了。

转载于:https://www.cnblogs.com/jalenwang/archive/2012/09/01/android-resouces.html

[转] Android系统如何实现UI的自适应相关推荐

  1. Android系统如何实现UI的自适应

    2019独角兽企业重金招聘Python工程师标准>>> 做Android应用的人都知道,要一个apk适用多个不同的手机屏幕是很容易的,就是在项目的res文件夹下面有多套相关的资源文件 ...

  2. android系统如何自适应屏幕大小

    2019独角兽企业重金招聘Python工程师标准>>> 1.屏幕相关概念 1.1分辨率 是指屏幕上有横竖各有多少个像素 1.2屏幕尺寸 指的是手机实际的物理尺寸,比如常用的2.8英寸 ...

  3. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

    出自:http://blog.csdn.net/luoshengyang/article/details/8079456 在前面的一系列文章中,我们学习了Android应用程序与SurfaceFlin ...

  4. Android 系统(58)---Android 系统 UI - SystemUI之功能介绍和UI布局实现

    Android 系统 UI - SystemUI之功能介绍和UI布局实现 前言 Android ROM开发过程中,难免会涉及到对SystemUI的修改,之前做过一些这方面的工作,现在整理下,准备按照如 ...

  5. android版本360ui,国产手机UI系统有哪些

    国产手机UI系统有哪些 UI系统的用户体验.生态系统的建立等"软实力"将是移动终端厂商的主战场,拥有生态系统的厂商才能掌握主动.那么,都有国产手机UI系统?下面就和jy135小编一 ...

  6. 苹果IOS与谷歌 android系统的UI设计原则

    一.苹果为IOS的界面设计提出了六大原则: 1.整体美学 整体美学指的是一个应用的表现和行为与它的功能完美集成,传达连贯的信息. 人们关心一个应用是否提供它承诺的功能,但他们也被应用的外观和行为强烈影 ...

  7. Android 系统(186)---最易懂的Android屏幕适配解决方案--总结版

    最易懂的Android屏幕适配解决方案--总结版 本文参考自: Google的官方权威适配文档 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Stormzhang:Android 屏幕适配 ...

  8. Android 系统(43)----Andropid 基础知识

    谈谈你对android系统(体系)架构的理解 Linux操作系统为核心,从下往上,依赖关系. 应用程序层:包括系统应用以及第三方应用. 应用程序框架:提供应用开发所必须的一些API框架,是软件复用的重 ...

  9. android系统GUI设计师必会资源图制作工具

    [原文:http://09bee.lofter.com/post/75947_b40cf/] android系统GUI设计师必会资源图制作工具draw9pacth完全教程,仅供初学者参考. 2011- ...

最新文章

  1. 2021年春季学期-信号与系统-第五次作业参考答案-第五小题
  2. python在什么系统中开发_Python虚拟开发环境,怎样才能在系统中创建
  3. cocos2dx vs2010 配置
  4. SAP Analytics Cloud exception aggregation type设置成LAST的效果
  5. 【Pytorch神经网络理论篇】 11 卷积网络模型+Sobel算子原理
  6. Prism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和Si...
  7. java命令行参数写哪里_Java的命令行参数
  8. 前端学习总结【103天】:CSS——不用JavaScript实现tab标签切换的两种方法
  9. 关于机器人方面的sci论文_化学教学论文发表【期刊论文】化学教学论文发表
  10. mysql各版本下载及免费mysql可视化工具下载(上班记录)
  11. url传参的编码与解码
  12. 太原科技大学主校区计算机学院,2021年太原科技大学有几个校区,大一新生在哪个校区...
  13. Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
  14. 管理菜单 结贴回复 来自 202.112.36.253 的回复: TTL 传输中过期
  15. js 实现统计网站访问量
  16. 神经网络 深度神经网络,深度神经网络训练
  17. easyui-textbox
  18. 让win7笔记本变成热点
  19. 男人也来大姨妈,你不信?痛苦不堪
  20. 第19章、 认识与分析登录档

热门文章

  1. HDU 2874 Connections between cities(LCA离线算法实现)
  2. namespace for c++
  3. jude的一些基本用法
  4. 机器学习基石-作业二-第10题分析
  5. 求最长回文串-从动态规划到马拉车之路(下)
  6. EasyExcel项目使用
  7. 时间转换python_Python 日期与时间转换的方法
  8. 龙武2服务器在维护,龙武5.25更新维护时间_龙武5.5更新维护详情_牛游戏网
  9. python桌面应用html_是否将Python后端与HTML / CSS / JS用户界面集成到桌面应用程序? - javascript...
  10. 比特币官方客户端钱包是用什么语言开发的_5种主流比特币客户端的开发选型...