本文转载于:http://www.oschina.net/question/272860_70761

今天碰到的一个问题,感觉应该其他人也会碰到,拿来分享一下。

我们都知道android在开发配置界面时一般都会使用dip和sp这种逻辑长度单位来实现屏幕无关,我也正是这么做的,今天用同事的I9300跑了一下我写的demo,发现”不对啊“,我自己的手机显示没问题啊,但在9300中出现了问题。主要就是一些按钮的背景是.9.png,其中文本是充满整个可填充区域的,结果在9300里面文字过大只能显示一部分。我反正郁闷了好一会,分析了一下可能原因最终锁定在dip和sp的使用上。在android内部会使用TypedValue.applyDimension函数将所有单位换算成px,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public

static

float

applyDimension(
int

unit,
float

value,
                                   DisplayMetrics
metrics)
{
    switch

(unit) {
    case

COMPLEX_UNIT_PX:
        return

value;
    case

COMPLEX_UNIT_DIP:
        return

value * metrics.density;
    case

COMPLEX_UNIT_SP:
        return

value * metrics.scaledDensity;
    case

COMPLEX_UNIT_PT:
        return

value * metrics.xdpi * (
1.0f/72);
    case

COMPLEX_UNIT_IN:
        return

value * metrics.xdpi;
    case

COMPLEX_UNIT_MM:
        return

value * metrics.xdpi * (
1.0f/25.4f);
    }
    return

0
;
}

观察dip和sp的换算,主要就是density和scaledDensity的区别,这两个值和手机屏幕本身参数有关,我在程序中使用 Resources.getSystem().getDisplayMetrics()得到当前系统屏幕相关的参数并打印出来结果就很显然了,我的手机两个值都是1.5(ps:我试了几款手机,这两个值都是相等的),而I9300中density=2.0,scaledDensity=2.6,这就知道前面现象的原因了,sp的换算比率比dip大,造成了字体的增幅超出按钮bg的增幅,于是文本就显示不下了。解决这个问题也很简单,只要在将android:textSize属性的单位有sp改成dip就行了。

虽然google推荐使用sp作为 android:textSize 属性的单位,但实际情况下,还是有可能出现问题:D

---------------话题补充---------------

@soso_fy:I9300确实有字体大小的设置选项,而且我同事的手机确实已经设置得比正常大一号(并不是所有手机都有该设置选项),为了界面布局的一致,像”按钮“之类的控件布局时还是使用dip做单位保险一点。

最新文章

  1. python 输出大文本文件
  2. Java 之 GUI
  3. bash/shell编程学习(1)
  4. HTML5体验改进的14条军规
  5. Sql导出数据报错-->SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问
  6. [Android Pro] Android 6.0 Root
  7. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期
  8. Anaconda安装与使用
  9. postgresql命令行
  10. javascript,css延迟加载器
  11. html5 header和group
  12. 扩展Date的DateDiff方法--日期差
  13. Android百度地图开发(三)范围搜索
  14. JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术
  15. 用指针将字符串a的内容复制到字符串b
  16. 图论测试题(一)第一题:longest
  17. asp.net(C#)html无限分类树 可新增 删除 修改
  18. Linux服务器上的oracle数据导入和导出
  19. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]
  20. Django学习-9-ORM多对多操作

热门文章

  1. 嵌套遍历<s:iterator>map=new TreeMap(string,Map(string,User))
  2. HDU 3829 - Cat VS Dog (二分图最大独立集)
  3. 用Ogre实现《天龙八部》场景中水面(TerrainLiquid)详解
  4. Linux Mint下编译Bochs
  5. Emacs+highlight-parentheses高亮括号
  6. PHP中的文件系统处理(一)
  7. Alice and Bob(不断补充)
  8. vs中附加IIS进程的调试方法
  9. Mac命令行语法高亮设置
  10. MINIX3 进程调度分析