具体的转换方法如下,网上都是有的,但是自己看了之后感觉还是有点不明不白的,具体为什么呢,可以继续看后面.

/** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}

首先先列出来相关的方法:

Resources.java

public Resources(AssetManager assets, DisplayMetrics metrics,            Configuration config, CompatibilityInfo compInfo) {        mAssets = assets;        mMetrics.setToDefaults();        mCompatibilityInfo = compInfo;        updateConfiguration(config, metrics);        assets.ensureStringBlocks();}

DisplayMetrics.java 相关方法

public void setToDefaults() {        widthPixels = 0;        heightPixels = 0;        density =  DENSITY_DEVICE / (float) DENSITY_DEFAULT;        densityDpi =  DENSITY_DEVICE;        scaledDensity = density;        xdpi = DENSITY_DEVICE;        ydpi = DENSITY_DEVICE;        noncompatWidthPixels = widthPixels;        noncompatHeightPixels = heightPixels;        noncompatDensity = density;        noncompatDensityDpi = densityDpi;        noncompatScaledDensity = scaledDensity;        noncompatXdpi = xdpi;        noncompatYdpi = ydpi;    } public static int DENSITY_DEVICE = getDeviceDensity();    private static int getDeviceDensity() {        // qemu.sf.lcd_density can be used to override ro.sf.lcd_density        // when running in the emulator, allowing for dynamic configurations.        // The reason for this is that ro.sf.lcd_density is write-once and is        // set by the init process when it parses build.prop before anything else.        return SystemProperties.getInt("qemu.sf.lcd_density",                SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));    }/**     * The reference density used throughout the system.     */    public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;/**     * Standard quantized DPI for medium-density screens.     */    public static final int DENSITY_MEDIUM = 160;

在 Resources.java 的构造函数里面调用DisplayMetrics 的setToDefaults 方法,使density 取值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

使density 最终的值和key:qemu.sf.lcd_density 和default_value:ro.sf.lcd_density 有关系,

系统里面一般并没有额外对key:qemu.sf.lcd_density 赋值,故取值ro.sf.lcd_density,而ro.sf.lcd_density 的值一般是在系统源码里面的设置好的了,比如:system.prop 里面可以设置该值.

更多相关文章

  1. Android(安卓)UI 测试框架Espresso详解
  2. 《Android(安卓)Fragment 非常详细的一篇》
  3. android studio快捷键记录
  4. Android(安卓)实现让ViewPager禁止滑动
  5. Android应用之Hybird混合开发,集成web页面的方法尝试
  6. android Java StringBuffer对象的append方法
  7. Android中ImageView使用网络图片资源的方法
  8. Android定时器之Handler的postDelyed方法
  9. Android(安卓)View之基础介绍(Android开发艺术探索)

随机推荐

  1. 修改android原型button样式
  2. Android(安卓)text文字阴影设置
  3. Android(安卓)layout属性大全
  4. android xml中设置自适应图片
  5. android 第一个界面 选项卡加toolbar
  6. Android(安卓)SDK Android(安卓)NDK 官方
  7. Android(安卓)SDK/Android(安卓)NDK/Andr
  8. Android(安卓)TextView 跑马灯效果
  9. android TextView 滚动条自动滚动最底
  10. android自定义主题样式