zoukankan      html  css  js  c++  java
  • Android dip(dp) 与 sp的自适应问题

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

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

    01public 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

  • 相关阅读:
    [记录] 原生JS 的常用方法封装
    [记录] JavaScript 中的DOM操作
    [记录] JavaScript 中的正则表达式(案例分析)
    图片查看器插件(带缩略图) viewer.js
    (二) 美化滚动条 JScrollPane.js
    关于数据库存储过程管理的一点建议
    根据属性名称来改变XML节点值
    hdu 3911 Black And White
    poj 3667 Hotel
    hdu 4217 Data Structure?
  • 原文地址:https://www.cnblogs.com/shihao/p/2707493.html
Copyright © 2011-2022 走看看