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」
[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
分析結果:
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
結果がよくないので、自分で何行かのコードを書いて、自分で測ってみました。
テストパラメータ:
テスト環境:i 9000(サムスン)
物理スクリーン:480*800 px
density:1.5
テストコード:
[java]
view plin
copy
?
//スクリーン密度の取得(方法1)
// ( 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
?
E/==MyScrenActivity============================================get Default Display(8509):screenWidth=320;screenHeight=533
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