`
v5browser
  • 浏览: 1139220 次
社区版块
存档分类
最新评论

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

 
阅读更多

做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了。


分享到:
评论

相关推荐

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

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

    android UI自适应验证

    android layout自适应是很麻烦的一块。本实例工程,验证了各种分辨率、各种密度下,android 自适应规律。

    UI自适应的Android软件自动化测试框架研究.pdf

    UI自适应的Android软件自动化测试框架研究.pdf

    android java 通用开发 自适应密度 webview

    android java 通用开发 自适应密度 使用的是html5+css3+javascript做ui ui使用的appcanui2.0 使用jquery1.8、isScroll5.0

    Android屏幕自适应计算工具 UI设计尺寸换算

    设计师在PS中先设计好UI,然后用这个工具量取像素px 与dp 转换。获得准确的dp值。

    Android软件自适应屏幕技巧

    一个手机UI开发方面对屏幕自适应的一些讲解和技巧介绍,虽然比较基础,但是对于很多人来说,里面的很多概念还是老搞不清楚。此文档里包括1、基础概念说明;2、Android的三种基本自适应方式;3、一点点必要的代码展现...

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

    当你定义应用的布局的UI时应该使用dp单位,确保UI在不同的屏幕上正确显示。 手机屏幕分类和像素密度的对应关系如表1所示 目前主要是以分辨率为800*480和854*480的手机用户居多 从以上的屏幕尺寸分布情况上看,...

    Android聊天界面UI模板

    描述:写一个聊天模块UI 需求: 1、将一个正方形 or 长方形的图片渲染成圆形图片,并且能保持原先的图片内容。 2、预显示文本要自适应屏幕宽度,不能叠加成两行或者多行,多出的部分可以用"..."表示。 3、近三天的...

    Android 图片自适应adapter demo

    该代码工程 博客地址http://write.blog.csdn.net/postedit listView 图片自适应高度

    Android自适应不同屏幕大小的全部方法

    本文讲述了Android自适应不同屏幕大小的全部方法。分享给大家供大家参考,具体如下: 本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕; 根据屏幕的...

    Android之TextView自适应大小

    对于设置TextView的字体默认大小对于UI界面的好看程度是很重要的,小屏幕设置的文字过大或者大屏幕设置的文字过小都造成UI的不美观 现在就让我们学习自适应大小的TextView控件,即当文字长度变化时,文字的大小会...

    Android 基础级日历UI范例源码.rar

    一个基础级的Android 日历UI界面源码,UI还没有真正写好,布局方面可自适应屏幕大小,在电脑上模拟安卓环境,看上去有些没对齐,不过在手机上这个就正常了,日历的界面目前比较小,可以调大一些,日历可触摸选择,可...

    Android开发教程_什么UI界面都有_棒.zip

    Android UI界面开发教程_什么安卓APP界面都有_棒 amr语音编码解码 Fragment View WebView 触摸 手势操作 抽象布局 屏幕解锁 照相机,相册 菜单 代码安全 通信安全 屏幕自适应分辨率 Action Bar HTML的javascript调用...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    疯狂Android讲义源码

     6.11 国际化和资源自适应 251  6.11.1 Java国际化的思路 252  6.11.2 Java支持的语言和国家 252  6.11.3 完成程序国际化 253  6.11.4 为Android应用提供国际化  资源 255  6.11.5 国际化Android应用 256  ...

    Android代码-android-card-slide-panel

    有图有真相 ...自定义ViewGroup对卡片view的高度实现了自适应。 细节。卡片之间联动的视觉效果,是像素级的精确。 不信,你下载下来look look。 使用方法 1. 在xml文件中引入CardSlidePanel

    Adriod学习笔记1

    如果你的Android程序需要自适应国际化,比如说多国语言等问题,那么就可以定义不同语言的UI布局,在程序装载时调用不同的布局。而且,如果我们需要修改UI的一些问题,就不必查看代码了,直接更改这些布局文件即可很...

    心电图自定义控件

    自定义的心电图控件 动态传入0--100的数字会动态波动 自适应屏幕

Global site tag (gtag.js) - Google Analytics