Android的单位px,pt,dp,sp总结和获取屏幕分辨率

px: pixels(像素). 是屏幕中可以显示的最小单位元素,px是设备密度有关的,不同设备显示效果不同。因为由于不同的设备密度不同,密度就是单位英寸的像素不同,在不同的手机上显示的大小就不同

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>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值