Androidは画面サイズと密度を取得します。

9061 ワード

Androidではスクリーンの長さが広くて、インターネットを参考にしましたが、実際と違って、私の携帯電話はi 9000です。スクリーンの大きさは480×800 pxです。結果は320*533です。
結果がよくないので、自分で何行かのコードを書いて、自分で測ってみました。
テストパラメータ:
テスト環境:i 9000(サムスン)
物理スクリーン:480*800 px
density:1.5
テストコード:
 
[java]
view plin
copy
print

//スクリーン密度の取得(方法1)
  • int screenWidth=get WindowManager().get Default Display().get Width()//スクリーン幅(ピクセル数:480 px)
  • int screenHeight=get WindowManager().get Default Display().get Height()//スクリーン高(画素、例えば800 p)
  • Log.e(TAG+「get Default Display」、「screenWidth=」+screenWidth+";screenHeight=「+screenHeight」
  • /スクリーン密度の取得(方法2)
  • DisplayMetrics dm=new DisplayMetrics()
  • dm=get Resource().get Display Metrics();
  • float density=dm.density;スクリーン密度(ピクセル比:0.75/1.0/1.5/2.0)
  • int densityDPI=dm.densityDpi;//画面密度(インチ毎ピクセル:120/160/240/320)
  • float xdpi=dm.xdpi;
  • float ydpi=dm.ydpi;
  • Log.e(TAG+「DisplayMetrics」、「xdpi=」+xdpi+";ydpi="+ydpi";
  • Log.e(TAG+「DisplayMetrics」、「density=」+density+「densityDPI=「+densityDPI」
  • screenWidth=dm.widthPixels;スクリーン幅(ピクセル数:480 px)
  • screenHeight=dm.height Pixels;//スクリーン高(画素、例えば800 px)
  • Log.e(TAG+「DisplayMetrics(111)」、「screenWidth=」+screenWidth+「screenHeight=「+screenHeight」
  • //スクリーン密度の取得(方法3)
  • dm=new DisplayMetrics()
  • get WindowManager().get Default Display().get Metrics(dm);
  • density=dm.density;//スクリーン密度(ピクセル比:0.75/1.0/1.5/2.0)
  • densityDPI=dm.densityDpi;/画面密度(インチ毎ピクセル:120/160/240/320)
  • xdpi=dm.xdpi;
  • ydpi=dm.ydpi;
  • Log.e(TAG+「DisplayMetrics」、「xdpi=」+xdpi+";ydpi="+ydpi";
  • Log.e(TAG+「DisplayMetrics」、「density=」+density+";densityDPI=「+densityDPI」
  • int screenWidthDip=dm.widthPixels;/スクリーン幅(dip)
  • int screenHeighttdip=dm.height Pixels;スクリーン幅(dip)
  • Log.e(TAG+“DisplayMetrics(222)”、“screenWidthDip=”+screenWidthDip+“screenHeighttdip=「+screenHeighttdip」
  • screenWidth=(int)(dm.widthPixels*density+0.5 f)//スクリーン幅(px,例えば:480 px)
  • screenHeight=(int)(dm.heightPixels*density+0.5 f)//スクリーン高(px、例えば:800 px)
  • Log.e(TAG+“DisplayMetrics(222)”、“screenWidth=”+screenWidth+“screenHeight=「+screenHeight」
    	    //       (  1)
    	    int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();		//    (  , :480px)
    	    int screenHeight = getWindowManager().getDefaultDisplay().getHeight();		//    (  , :800p)
    	    
    	    Log.e(TAG + "  getDefaultDisplay", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);
    	    
    	    
    	    //       (  2)
    	    DisplayMetrics dm = new DisplayMetrics();
    	    dm = getResources().getDisplayMetrics();
    	    
    	    float density  = dm.density;		//     (    :0.75/1.0/1.5/2.0)
    	    int densityDPI = dm.densityDpi;		//     (    :120/160/240/320)
    	    float xdpi = dm.xdpi;			
    	    float ydpi = dm.ydpi;
    	    
    	    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);
    	    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);
    	    
    	    screenWidth  = dm.widthPixels;		//    (  , :480px)
    	    screenHeight = dm.heightPixels;		//    (  , :800px)
    	    
    	    Log.e(TAG + "  DisplayMetrics(111)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);
    	    
    	    
    	    
    	    //       (  3)
    	    dm = new DisplayMetrics();
    	    getWindowManager().getDefaultDisplay().getMetrics(dm);
    	    
    	    density  = dm.density;		//     (    :0.75/1.0/1.5/2.0)
    	    densityDPI = dm.densityDpi;		//     (    :120/160/240/320)
    	    xdpi = dm.xdpi;			
    	    ydpi = dm.ydpi;
    	    
    	    Log.e(TAG + "  DisplayMetrics", "xdpi=" + xdpi + "; ydpi=" + ydpi);
    	    Log.e(TAG + "  DisplayMetrics", "density=" + density + "; densityDPI=" + densityDPI);
    	    
    	    int screenWidthDip = dm.widthPixels;		//    (dip, :320dip)
    	    int screenHeightDip = dm.heightPixels;		//    (dip, :533dip)
    
    	    Log.e(TAG + "  DisplayMetrics(222)", "screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);
    	    
    	    screenWidth  = (int)(dm.widthPixels * density + 0.5f);		//    (px, :480px)
    	    screenHeight = (int)(dm.heightPixels * density + 0.5f);		//    (px, :800px)
    	    
    	    Log.e(TAG + "  DisplayMetrics(222)", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);
    結果は以下の通りです
     
    [java]
    view plin
    copy
    print

    E/==MyScrenActivity============================================get Default Display(8509):screenWidth=320;screenHeight=533
  • E/==MyScrenActivity===============================================DisplayMetrics(8509):xdpi=156.37;ydpi=157.538
  • E/==MyScrenActivity=================================================DisplayMetrics(8509):density=1.0;densityDPI=160
  • E/==MyScrenActivity=============================================DisplayMetrics(8509):screenWidth=320;screenHeight=533
  • E/==MyScrenActivity==================================================DisplayMetrics(8509):xdpi=23.6153;ydpi=236.7907
  • E/==MyScrenActivity================================================DisplayMetrics(8509):density=1.5;densityDPI=
  • E/==MyScrenActivity==================================================DisplayMetrics(222):screenWidthDip=320;screenHeighttdip=533
  • E/==MyScrenActivity==============================================DisplayMetrics(222):screenWidth=480;screenHeight=800
  • E/== MyScreenActivity ===================================  getDefaultDisplay( 8509): screenWidth=320; screenHeight=533
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160
    E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907
    E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240
    E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533
    E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidth=480; screenHeight=800
     
     
    分析結果:
     
    onDraw()方法の中で
    方法1と2は、結果が一致しています。320*533です。明らかにテスト機i 9000のスクリーンサイズではありません。
    方法3は、方法1と2で得られた結果を、densityを掛けた後、完璧な480*800、perfect!
    注:densityが1より大きい場合は、ターゲットSdk Verssionを4-9の間に設定する必要があります。例えば、<uses-sdk android:minSdkVersion=“3”android:target Sdk Verssion=“10”/>
     
     
    しかし、これは方法を説明します。3は必ず通用しますか?
    回答は否定的です。私もシミュレータ、HTC G 14物理機、及びVieSonic、Galaxy平板でテストしました。方法3はdensity=1.5の時に実際のスクリーン値を拡大しました。例えば、HTC G 14です。
    HTC G 14では、実際のスクリーンサイズは、直接dm.widthPixels、dm.height Pixelsを通じて、実際の物理画面サイズ(540,960)が得られます。
    一つの共通の方法で実際の物理画面サイズを取得できない原因は、Androidシステムがオープンしたためであり、携帯電話メーカーによっては製造基準が統一されておらず、携帯電話の画面が規定されているからである。
     
    コードをよく分析して、問題がコードにあることを発見しました。
    get WindowManager().get Default Display().get Metrics(dm)
    Initialize a Display Metrics object from this display's data.
     
    dm=get Resource().get Display Metrics()
    Return the current display metrics that are in effect for this reource object.The returned object shound be treated as read-only.
    来源:http://blog.csdn.net/sunboy_2050/articale/detail/668883