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

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

01 public static float applyDimension(int unit, float value,
02 DisplayMetrics metrics)
03 {
04 switch (unit) {
05 case COMPLEX_UNIT_PX:
06 return value;
07 case COMPLEX_UNIT_DIP:
08 return value * metrics.density;
09 case COMPLEX_UNIT_SP:
10 return value * metrics.scaledDensity;
11 case COMPLEX_UNIT_PT:
12 return value * metrics.xdpi * (1.0f/72);
13 case COMPLEX_UNIT_IN:
14 return value * metrics.xdpi;
15 case COMPLEX_UNIT_MM:
16 return value * metrics.xdpi * (1.0f/25.4f);
17 }
18 return 0;
19 }

观察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

更多相关文章

  1. 【有人@我】Android中高亮变色显示文本中的关键字
  2. Android的px,dpi,dip三者的关系详解
  3. Android像素单位dp、sp、px、pt的区别和比较
  4. Android中读取系统图库(包含相册)中的图片,显示图片与图片的路径
  5. android EditText多行文本输入的若干问题
  6. 牛逼的Android(安卓)UI--第18章 与用户交互相关的设计模式 (中)
  7. 作为Android开发者 你真的知道app从启动到主页显示的过程吗?
  8. android SoftKeypad 软键盘的问题
  9. android 系统隐藏和显示虚拟按键的几种方法(不要太详细了)

随机推荐

  1. Android(安卓)新手摸石头过河
  2. Android中的Bundle类
  3. NDK 学习 ndk基础
  4. 最近的工作记录:键盘敲入的Linux Shell命
  5. Error:android-apt plugin is incompatib
  6. Android接收jsp中动态生成的xml或json数
  7. listView加快scroll
  8. android官网图像与动画章节demo的分析
  9. android中的autocomplete例子小结
  10. android intent