density值表示每英寸有多少个显示点,与分辨率是两个概念。HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120 。
densitydpi:屏幕像素密度 一般计算公式为,由屏幕长宽的分辨率,根据勾股定律求出对角线的像素数,再除以屏幕的尺寸,即可得densitydpi.
// 通过WindowManager获取
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
System.out.println("heigth : " + dm.heightPixels);
System.out.println("width : " + dm.widthPixels);
// 通过Resources获取
DisplayMetrics dm2 = getResources().getDisplayMetrics();
System.out.println("heigth2 : " + dm2.heightPixels);
System.out.println("width2 : " + dm2.widthPixels);
// 获取屏幕的默认分辨率
Display display = getWindowManager().getDefaultDisplay();
System.out.println("width-display :" + display.getWidth());
System.out.println("heigth-display :" + display.getHeight());
可以看到,第一、第三种方法都用到了getWindowManager()这个方法,而第二种方法没有用getWindowManager()。有些网友说书写getWindowManager()后eclipse会报错,说没有getWindowManager()这个方法,这是什么原因呢?因为getWindowManager()这个方法是在类Activity中的,如果你自己编写的类不是继承于类Activity,那么必然在这个类中书写代码就不能用到getWindowManager()这个方法。所以当你自己编写的类不是继承于类Activity,那么就只能应用第二种方法获取手机屏幕的大小。
public class MainActivity extends Activity { private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.textView1); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub text.setText(getScreenSize()); } }); } private String getScreenSize() { DisplayMetrics dm = new DisplayMetrics(); getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm); int h = dm.heightPixels; int w = dm.widthPixels; float f = dm.density; int dens = dm.densityDpi; double wi = (double)w/dens; double hi = (double)h/dens; double x = Math.pow(wi, 2); double y =Math.pow(hi, 2); double screenInches = Math.sqrt(x+y); return "height:" + h + "\nwidth:" + w + "\ndensity:" + f+"\nscreenInches:"+screenInches+" \ndm:"+dm; } }<span style="color:#ff0000;"> </span>