Android对不同DPI的dimen选择优先级问题

原创 2015年11月21日 20:05:31

Android对不同DPI的dimen选择优先级问题

问题描述

笔者最近发现这么一个问题,如果仅对values-ldpi和values-xxhdpi下的dimen进行设定,那么hdpi下的手机进行将会如何选择呢?

问题解决

笔者通过查找native层的源代码ResourceType.cpp中的isBetterThan()方法得到了确切的答案。先看看源码对这个屏幕密度适配做了怎样的处理。

bool ResTable_config::isBetterThan(const ResTable_config& o,
        const ResTable_config* requested) const {
        ..........

       if (screenType || o.screenType) {
            if (density != o.density) {
                // Use the system default density (DENSITY_MEDIUM, 160dpi) if none specified.
                const int thisDensity = density ? density : int(ResTable_config::DENSITY_MEDIUM);
                const int otherDensity = o.density ? o.density : int(ResTable_config::DENSITY_MEDIUM);

                // We always prefer DENSITY_ANY over scaling a density bucket.
                if (thisDensity == ResTable_config::DENSITY_ANY) {
                    return true;
                } else if (otherDensity == ResTable_config::DENSITY_ANY) {
                    return false;
                }

                int requestedDensity = requested->density;
                if (requested->density == 0 ||
                        requested->density == ResTable_config::DENSITY_ANY) {
                    requestedDensity = ResTable_config::DENSITY_MEDIUM;
                }

                // DENSITY_ANY is now dealt with. We should look to
                // pick a density bucket and potentially scale it.
                // Any density is potentially useful
                // because the system will scale it.  Scaling down
                // is generally better than scaling up.
                int h = thisDensity;
                int l = otherDensity;
                bool bImBigger = true;
                if (l > h) {
                    int t = h;
                    h = l;
                    l = t;
                    bImBigger = false;
                }

                if (requestedDensity >= h) {
                    // requested value higher than both l and h, give h
                    return bImBigger;
                }
                if (l >= requestedDensity) {
                    // requested value lower than both l and h, give l
                    return !bImBigger;
                }
                // saying that scaling down is 2x better than up
                if (((2 * l) - requestedDensity) * h > requestedDensity * requestedDensity) {
                    return !bImBigger;
                } else {
                    return bImBigger;
                }
            }
    .......
}

总体来说走的就近原则,选择离当前密度最近的适配值。系统会便遍历整个values下对应的dimen值,选择一个可包含当前屏幕密度的最小区间,如果实在找不到这样的区间,如ldpi和hdpi进行了适配,但是手机是xxhdpi,那么此时就会选择离当前手机屏幕密度最近的端点进行适配,也就是(requestedDensity >= h)或者(l >= requestedDensity—)的情况。如果这样的区间存在,那么就执行 (((2 * l) - requestedDensity) * h > requestedDensity * requestedDensity) 的算法,这里requestedDensity就指的是需要适配手机屏幕密度。这里的l和h为其具体值(单位dpi,如240dpi)与系统默认密度160dpi的比值,也就是系统对dp转化为px的缩放比。

举个例子,就以开篇的那个问题为例,此时l = 0.75, h = 3.0,requestedDensity = 1.5, 那么可以计算得出((2 * l) - requestedDensity) * h < requestedDensity * requestedDensity),返回true,也就是返回了h,也就是xxhdpi的dimen值

从哪里回去此篇代码呢?这个CPP是从GITHUB中直接clone过来的,如果读者需要,只要执行

$git clone https://github.com/android/platform_frameworks_base.git

即可此文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

CSS基础学习十一:选择器的优先级

在CSS基础学习的篇章中,从第四篇博客开始说选择器,到昨天基本已经说完了。今天我们总结一下,选择器作 用:告知浏览器需要设置哪个dom元素的样式。最后来说说选择器一个重要的问题,选择器的优先级。判断优...
  • erlian1992
  • erlian1992
  • 2015年11月15日 14:49
  • 3642

css选择器优先级及权重计算

一、优先级分类 通常可以将css的优先级由高到低分为6组: 第一优先级:无条件优先的属性只需要在属性后面使用!important。它会覆盖页面内任何位置定义的元素样式。ie6不支持该属性。...
  • Coder_Chang
  • Coder_Chang
  • 2017年05月27日 09:57
  • 1711

CSS选择器与样式优先级

一条CSS规则包含两个部分:选择器和声明块,其中选择器决定了声明块中的CSS样式,掌握选择器的用法是掌握CSS的基础之一。CSS中的选择器基本可以分为以下几种类型:元素选择器、关系选择器、属性选择器、...
  • liumulinsp
  • liumulinsp
  • 2015年08月31日 16:05
  • 2823

android Px,DP转换工具(可选择不同的dpi)

  • 2017年03月21日 18:39
  • 4KB
  • 下载

GDI+ 绘图时,相同分辨率, DPI不同时图片显示的问题.

最后在VC中使用GDI+作图片处理时, 突然发现有几张图片显示不正常,未按实际像素大小显示. 代码很简单: void CTransBmpDlg::OnBnClickedImgTest() { ...
  • xiaohuh421
  • xiaohuh421
  • 2012年08月21日 12:41
  • 2565

Android精确适配不同的dpi和屏幕尺寸(附dimens按比例变化数字的工具类)

一、引言   Android的开源使厂商无需自行研发OS,大大降低了研发、生产的成本,使得Android平板品牌如雨后春笋般爆发,山寨机厂商们似乎又找到了一丝希望。与此同时带来的是广大开发者的苦不堪...
  • h55l55
  • h55l55
  • 2015年07月20日 22:25
  • 3502

Android加载不同DPI资源与内存消耗之间的关系

2015/04/21 目录 [隐藏] 1 Android DPI 分级标准简介 2 不同设备共享同一套 DPI 资源有哪些问题? 3 问题:DPI 越小的文件夹内存...
  • L25000
  • L25000
  • 2015年04月30日 12:31
  • 373

Android加载不同DPI资源与内存消耗之间的关系

2015-05-07 14:10 32人阅读 评论(0) 收藏 举报 目录(?)[-] Android DPI 分级标准简介不同设备共享同一套 DPI 资源有哪些问题问题DPI 越...
  • qq_27073205
  • qq_27073205
  • 2015年05月12日 20:50
  • 293

Android平板开发精确适配不同的dpi和屏幕尺寸

一、引言   Android的开源使厂商无需自行研发OS,大大降低了研发、生产的成本,使得Android平板品牌如雨后春笋般爆发,山寨机厂商们似乎又找到了一丝希望。与此同时带来的是广大开发者...
  • u012242853
  • u012242853
  • 2014年04月04日 13:11
  • 700

Android平板上开发应用-关于精确适配不同的dpi和屏幕尺寸

转载 http://www.cnblogs.com/zealotrouge/archive/2012/11/23/2784774.html Android平板上开发应用的一点心得——精确适配不同的...
  • u010872557
  • u010872557
  • 2017年02月17日 13:52
  • 1405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android对不同DPI的dimen选择优先级问题
举报原因:
原因补充:

(最多只允许输入30个字)