Android里面的sp和dp网上有很多文章都谈过了,但是看后总有一种意犹未尽的感觉。现在我也来谈谈dp和sp,和大家交流一下,不对之处欢迎拍砖。

一、dp(或者dip device independent pixels

一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp=1px。不同设备有不同的显示效果,这个和设备硬件有关。

android里的代码如下:

// 文件位置:android4.0\frameworks\base\core\java\android\util\DisplayMetrics.java    public static final int DENSITY_DEVICE = getDeviceDensity();    public float density;        public void setToDefaults() {        widthPixels = 0;        heightPixels = 0;        density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; // 这里dp用的比例         densityDpi = DENSITY_DEVICE;        scaledDensity = density; // 这是sp用的比例        xdpi = DENSITY_DEVICE;        ydpi = DENSITY_DEVICE;        noncompatWidthPixels = 0;        noncompatHeightPixels = 0;    }    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)); // 从系统属性ro.sf.lcd_density里获取屏幕密度                // 文件位置:android4.0\packages\inputmethods\latinime\java\src\com\android\inputmethod\latin\Utils.java    public static float getDipScale(Context context) {        final float scale = context.getResources().getDisplayMetrics().density;        return scale;    }    public static int dipToPixel(float scale, int dip) {        return (int) (dip * scale + 0.5); // dip到px的换算公式    }                

二、sp(Scaled Pixels

主要用于字体显示,与刻度无关的一种像素,与dp类似,但是可以根据用户的字体大小首选项进行缩放。

// 文件位置:android4.0\packages\apps\settings\src\com\android\settings\Display.java    private Spinner.OnItemSelectedListener mFontSizeChanged                                    = new Spinner.OnItemSelectedListener() {        public void onItemSelected(android.widget.AdapterView av, View v,                                    int position, long id) {            if (position == 0) {  // 下面是设置字体比例的代码                mCurConfig.fontScale = .75f;            } else if (position == 2) {                mCurConfig.fontScale = 1.25f;            } else {                mCurConfig.fontScale = 1.0f;            }            updateFontScale();        }        public void onNothingSelected(android.widget.AdapterView av) {        }    };        private void updateFontScale() {        mDisplayMetrics.scaledDensity = mDisplayMetrics.density *                mCurConfig.fontScale; // 将设置的字体比例代码合到scaledDensity里去        float size = mTextSizeTyped.getDimension(mDisplayMetrics);        mPreview.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);    }                 



更多相关文章

  1. Android(安卓)仿 iphone 自定义滚动选择器
  2. [Unity] 在Unity中导入Android原生插件
  3. Android一个页码的导航条
  4. android 控制POS机图文打印(二)
  5. Android使用ViewDragHelper实现简单的view拖拽和吸边功能
  6. 图解Android(安卓)View的scrollTo(),scrollBy(),getScrollX(), g
  7. [android] 百度地图开发 (三).定位当前位置及getLastKnownLocati
  8. android中引用项目工程中的sqlite文件
  9. Android的PopupWindow的使用,根据点击位置显示弹窗

随机推荐

  1. androin各类动画效果实现
  2. android 写入联系人
  3. 常用的android intent和intent action
  4. 程序猿学习的网站
  5. ubuntu 9.04上如果去获得android最新源
  6. 如何同时启动两个Android 模拟器
  7. Android图像处理(一)色调、饱和度、亮度
  8. 地图相关
  9. Android获取天气预报
  10. Android(安卓)OpenGLES2.0(十五)——利用EG