px: pixels(像素). 是屏幕中可以显示的最小单位元素,px是设备密度有关的,不同设备显示效果不同。因为由于不同的设备密度不同,密度就是单位英寸的像素不同,在不同的手机上显示的大小就不同
通过 DisplayMetrics.toString()方法可以获取到 DisplayMetrics的大部分信息,以下是模拟器上不同分辨率所有对应的信息:
pt: point,是一个标准的长度单位,1pt=1/72英寸,一般pt都会做字体的单位来使用
dp(dip): density dependent pixels(密度独立像素). 不同设备有不同的密度,不同的显示效果,这个和设备硬件有关。和px相比,它在不同密度的屏幕上显示的比例保持一致
密度Density:
Android中的密度就是屏幕每英寸包含的像素数目,单位是dpi(dots per inch).比如实体手机屏幕的宽是2英寸长是3英寸,
如果它的分辨率是320*480像素,那么每英寸包含的像素点就是320/2=160dpi(横向),480/3=160dpi,那么这个屏幕的密度就是160dpi,
如果它的分辨率是640*960像素,那么这个屏幕的密度就是320dpi。
dp和px转换:
Android规定,在160dpi的屏幕上,1dp=1px,在320dpi的屏幕上,1dp=2px
计算公式:px = dp * (dpi / 160),说明1dp代表了多少个px。以160dpi为基准,密度是160dpi的多少倍就乘以dp就是px值
比如:在160dpi上,组件设置的width=200dp,那么它的实际px值就是200*(160/160)=200px,在320dpi的密度上,实际px值就是200*(320/160)=400px
sp:可伸缩像素,解决文字大小适配问题。
获取屏幕分辨率:
在一个Activity的onCreate方法中,写入如下代码:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
注:构造函数DisplayMetrics 不需要传递任何参数;获得WindowManager 之后, getDefaultDisplay() 方法将取得的默认的显示信息,返回的是一个Display 对象,此对象的getMetrics(Metrics metrics)方法把分辨率信息传到 DisplayMetrics 对象中。通过 DisplayMetrics.toString()方法可以获取到 DisplayMetrics的大部分信息,以下是模拟器上不同分辨率所有对应的信息:
QVGA : {density=0.75, width=240, height=320, scaledDensity=0.75, xdpi=120.0, ydpi=120.0}
HVGA : {density=1.0, width=320, height=480, scaledDensity=1.0, xdpi=160.0, ydpi=160.0}
WVGA : {density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=240.0, ydpi=240.0}
其中,density为显示的逻辑分辨率;width及height就为屏幕分辨率(为绝对宽度与高度),与fields中的widthPixels及 heightPixels一致;scaleDensity与density一致;xdpi及ydpi为x方向与y方向的像素密度。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
package com.example.disolaymetrics;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView mWidthPx,mHeightPx,mScreen,mWidthDpi,mHeightDpi,mDensity,mDensityDPI;
TextView mScreenWidth,mScreenHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
//实例化DisplayMetrics对象
DisplayMetrics mDisplaymetics=new DisplayMetrics();
//WindowManager获得默认Display对象
Display mDispaly=getWindowManager().getDefaultDisplay();
//默认Display对象把值传入DisplayMetrics对象中
mDispaly.getMetrics(mDisplaymetics);
mWidthPx.setText("宽像素(px):"+mDisplaymetics.widthPixels);
mHeightPx.setText("高像素(px):"+mDisplaymetics.heightPixels);
mScreen.setText("屏幕分辨率:"+mDisplaymetics.widthPixels+"*"+mDisplaymetics.heightPixels);
mWidthDpi.setText("宽Dpi(dpi):"+(int) mDisplaymetics.xdpi);
mHeightDpi.setText("高Dpi(dpi):"+(int) mDisplaymetics.ydpi);
mDensity.setText("屏幕逻辑密度(屏幕密度/160):"+(int) mDisplaymetics.density);
mDensityDPI.setText("屏幕密度(dpi):"+mDisplaymetics.densityDpi);
}
public void initViews() {
mWidthPx=(TextView) findViewById(R.id.textView1);
mHeightPx=(TextView) findViewById(R.id.textView2);
mScreen=(TextView) findViewById(R.id.textView3);
mWidthDpi=(TextView) findViewById(R.id.textView4);
mHeightDpi=(TextView) findViewById(R.id.textView5);
mDensity=(TextView) findViewById(R.id.textView6);
mDensityDPI=(TextView) findViewById(R.id.textView7);
}
}
注意要加权限!!!!!!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.disolaymetrics"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="22"
android:targetSdkVersion="22" />
<!-- 读手机状态权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>