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); }