1. 程式人生 > >獲取手機螢幕密度dpi和對應的資原始檔夾

獲取手機螢幕密度dpi和對應的資原始檔夾

1、首先看一下畫素密度對應的Android資原始檔夾

dpi範圍

密度
0dpi ~ 120dpi ldpi
120dpi ~ 160dpi mdpi
160dpi ~ 240dpi hdpi
240dpi ~ 320dpi xhdpi
320dpi ~ 480dpi xxhdpi
480dpi ~ 640dpi xxxhdpi

2.效果圖


3.主要的程式碼

<span style="font-size:18px;">private TextView mTv_xdpi;
    private TextView mTv_ydpi;
    private TextView mTv_dpi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控制元件
        initView();
        //獲取x、ydpi
        getXydpi();
    }
    /**
    * @Description:獲取x、y的dpi,得到的資料,基本上是一致的
    * @author  作者 :likun
    * @date 建立時間:2016/6/24 16:06
    * @parameter :
    * @return :
    */
    private void getXydpi() {
        float xdpi = getResources().getDisplayMetrics().xdpi;
        float ydpi = getResources().getDisplayMetrics().ydpi;
        mTv_xdpi.setText(xdpi+"");
        mTv_ydpi.setText(ydpi+"");
        getDpi(xdpi);
    }
    /**
    * @Description:匹配得到手機的dpi
    * @author  作者 :likun
    * @date 建立時間:2016/6/24 16:07
    * @parameter :
    * @return :
    */
    private void getDpi(float xdpi) {
        String dpi="";
        if(xdpi>=0&&xdpi<120){
            dpi="ldpi";
        }else if(xdpi>=120&&xdpi<160){
            dpi="mdpi";
        }else if(xdpi>=160&&xdpi<240){
            dpi="hdpi";
        }else if(xdpi>=240&&xdpi<320){
            dpi="xhdpi";
        }else if(xdpi>=320&&xdpi<480){
            dpi="xxhdpi";
        }else if(xdpi>=480&&xdpi<640){
            dpi="xxxhdpi";
        }
        mTv_dpi.setText(dpi);
    }

    /**
    * @Description:初始化控制元件
    * @author  作者 :likun
    * @date 建立時間:2016/6/24 16:03
    * @parameter :
    * @return :
    */
    private void initView() {
        mTv_xdpi = (TextView) findViewById(R.id.tv_xdpi);
        mTv_ydpi = (TextView) findViewById(R.id.tv_ydpi);
        mTv_dpi = (TextView) findViewById(R.id.tv_dpi);
    }</span>
4.開發注意事項

       比如我的手機螢幕密度是xxhdpi,那麼xxhdpi資料夾下的圖片就是最適合的圖片。因此,如果xxhdpi資料夾下有這張圖就會優先被使用,在這種情況下,圖片是不會被縮放的。但是,如果xxhdpi資料夾下沒有這張圖時,系統就會自動去其它資料夾下找這張圖了,優先會去更高密度的資料夾下找這張圖片,如果還是沒有資源圖片,接下來會嘗試再找更高密度的資料夾,發現沒有更高密度的了,這個時候會去nodpi資料夾找這張圖,發現也沒有,那麼就會去更低密度的資料夾下面找,依次是xhdpi -> hdpi -> mdpi -> ldpi。
總體匹配規則就是這樣,那麼比如說現在終於在mdpi資料夾下面找到圖了,但是系統會認為你這張圖是專門為低密度的裝置所設計的,如果直接將這張圖在當前的高密度裝置上使用就有可能會出現畫素過低的情況,於是系統自動幫我們做了這樣一個放大操作。
那麼同樣的道理,如果系統是在xxxhdpi資料夾下面找到這張圖的話,它會認為這張圖是為更高密度的裝置所設計的,如果直接將這張圖在當前裝置上使用就有可能會出現畫素過高的情況,於是會自動幫我們做一個縮小的操作。

       但實際情況是,公司的UI們通常就只會給一套圖片資源,想讓他們針對每種密度的裝置都設計一套圖片資源,並且還是按照我們上面講的縮放比例規則來設計,就有點想得太開心了。沒錯,這個就是現實情況,那麼在這種情況下,我們應該將僅有的這一套圖片資源放在哪個密度的資料夾下呢?
      可以這樣來分析,根據我們剛才所學的內容,如果將一張圖片放在低密度資料夾下,那麼在高密度裝置上顯示圖片時就會被自動放大,而如果將一張圖片放在高密度資料夾下,那麼在低密度裝置上顯示圖片時就會被自動縮小。那我們可以通過成本的方式來評估一下,一張原圖片被縮小了之後顯示其實並沒有什麼副作用,但是一張原圖片被放大了之後顯示就意味著要佔用更多的記憶體了。因為圖片被放大了,畫素點也就變多了,而每個畫素點都是要佔用記憶體的。