Android 屏幕分辯率相關問題

jopen 12年前發布 | 29K 次閱讀 Android Android開發 移動開發

Android 屏幕分辯率相關問題:


Android 可設置為隨著窗口大小調整縮放比例及設定fixed的窗口大小。
對于surface的控制在SurfaceHolder類中進行
而Android 屏幕分辯率中已經有一個類DisplayMetics提供

Andorid.util 包下的DisplayMetrics 類提供了一種關于顯示的通用信息,如顯示大小,分辨率和字體。

為了獲取DisplayMetrics 成員,首先初始化一個對象如下:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
String str = metrics.toString();
String str = "屏幕分辨率為:" + metrics.widthPixels
                +" * "+metrics.heightPixels;
        textview.setText(str); //顯示
    
在CTS中有如下一段代碼可以體現出不同的單位顯示情況:
    public void testAccessTextSize() {
        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();


        mTextView = new TextView(mActivity);
        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
                mTextView.getTextSize(), 0.01f);


        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
                mTextView.getTextSize(), 0.01f);


        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
                mTextView.getTextSize(), 0.01f);


        // setTextSize by default unit "sp"
        mTextView.setTextSize(20f);
        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
                mTextView.getTextSize(), 0.01f);


        mTextView.setTextSize(200f);
        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
                mTextView.getTextSize(), 0.01f);
    }
   

這里面有幾個單位dip, dp, px, sp概念必須了解一下先:
dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,
    這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。 
px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。 
pt: point,是一個標準的長度單位,1pt=1/72英寸,用于印刷業,非常簡單易用; 
sp: scaled pixels(放大像素). 主要用于字體顯示best for textsize,根據 google 的建議,
   TextView 的字號最好使用 sp 做單位
   
程序員通常以像素為單位設計計算機用戶界面,但是如果顯示分辯率發生變更(更高時),
則以前做的應用界面會相應縮小,所以有必要使用與分辨率無關的度量單位解決此問題。

Android支持下列所有單位:
px(像素):屏幕上的點。 
in(英寸):長度單位。 
mm(毫米):長度單位。 
pt(磅):1/72英寸。 
dp(與密度無關的像素):一種基于屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:與dp相同,多用于android/ophone示例中。

dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp或sp。但如果
設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。
所以為了使用戶界面能夠在現在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為
文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用矢量圖形,而不是用位圖

附帶兩個問題的解決:
解碼圖片顯示時,設定的density會影響到顯示效果

在DisplayMetrics.java中定義的默認值:
    /
     Standard quantized DPI for low-density screens.
    
/
    public static final int DENSITY_LOW = 120;


    /

     Standard quantized DPI for medium-density screens.
    
/
    public static final int DENSITY_MEDIUM = 160;


    /
     Standard quantized DPI for high-density screens.
    
/
    public static final int DENSITY_HIGH = 240;


    /

     Standard quantized DPI for extra-high-density screens.
    
/
    public static final int DENSITY_XHIGH = 320;    
    
    /
     The reference density used throughout the system.
    
/
    public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
    
    1、如果圖片解碼像素高但顯示效果不怎么樣時,請修改下DENSITY_DEFAULT看個效果
    public static final int DENSITY_DEFAULT = DENSITY_XHIGH;
    
    顯示例子:
Options opts = new Options();
opts.inScaled = false;
opts.inSampleSize = 1;


opts.inScreenDensity = DisplayMetrics.DENSITY_HIGH;
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
mBitmapbg = BitmapFactory.decodeResource(this.getResources(), R.drawable.bj, opts);
BitmapDrawable bd = new BitmapDrawable(mBitmapbg);
    
    2、如果圖片在不同的顯示頻率下被放大了,那么有可能與webview相關,這也是density影響的
    
     /

     Enum for specifying the WebView's desired density.
    
FAR makes 100% looking like in 240dpi
     MEDIUM makes 100% looking like in 160dpi
    
CLOSE makes 100% looking like in 120dpi
     */
    public enum ZoomDensity {
        FAR(150),      // 240dpi
        MEDIUM(100),    // 160dpi
        CLOSE(75);     // 120dpi
        ZoomDensity(int size) {
            value = size;
        }
        int value;
    }
    
    那么是否可能根據屏幕的分辯率進行動態設定呢?
    int dDensity = getResources().getDisplayMetrics().densityDpi ; 
    WebSettings.ZoomDensity zDensity = WebSettings.ZoomDensity.MEDIUM ; 
    switch(dDensity) {
     case DisplayMetrics.DENSITY_LOW :  
     zDensity = WebSettings.ZoomDensity.CLOSE; 
     break;
     case DisplayMetrics.DENSITY_MEDIUM: 
     zDensity = WebSettings.ZoomDensity.MEDIUM; 
     break;
     case DisplayMetrics.DENSITY_HIGH: 
     zDensity = WebSettings.ZoomDensity.FAR;  
     break ;
    }
    webSettings.setDefaultZoom(zDensity); </span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!