老生常談之Android裡的dp和sp

來源:互聯網
上載者:User

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.