您的位置:首页 > 移动开发 > Android开发

Android屏幕分辨率的问题,dp,px,density等概念

2016-03-30 16:42 579 查看
PX (计算机语言中的像素)

PX是Pixel的缩写,若把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”。这种最小的图形的单元能在屏幕上显示通常是单个的染色点。

density表示每英寸有多少个显示点,与分辨率是两个不同的概念。

分辨率可以从显示分辨率与图像分辨率两个方向来分类。

显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。

描述分辨率的单位有:(dpi点每英寸)、lpi(线每英寸)和ppi(像素每英寸)。但只有lpi是描述光学分辨率的尺度的。虽然dpi和ppi也属于分辨率范畴内的单位,但是他们的含义与lpi不同。而且lpi与dpi无法换算,只能凭经验估算。

常见分辨率如下:

显示器            

            

标屏    分辨率    宽屏    分辨率

QVGA    320×240    WQVGA    400×240

VGA    640×480    WVGA    800×480

SVGA    800×600    WSVGA    1024×600

XGA    1024×768    WXGA    1280×720/1280×768/1280×800

XGA+    1152×864    WXGA+    1366×768

SXGA    1280×1024/1280×960    WSXGA    1440×900

SXGA+    1400×1050    WSXGA+    1680×1050

UXGA    1600×1200    WUXGA    1920×1200

QXGA    2048×1536    WQXGA    2560×1600

dip(dp): device independent pixels(设备独立像素)

dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

dpi: DPI是Dots Per Inch(每英寸所打印的点数)的缩写,

sp: scaled pixels(放大像素)。主要用于字体显示best for textsize。与字体大小设置有关系

dp与px换算公式:

pixs =dips * (densityDpi/160).

dips=(pixs*160)/densityDpi

但是我们在代码里面进行转化的时候还需要有一个偏移值:0.5f

apk的资源包中

当屏幕density=240时,使用hdpi 标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源

当屏幕density=320时,使用xhdpi标签的资源

当屏幕density=480时,使用xxhdpi标签的资源

不加任何标签的资源是各种分辨率情况下共用的

获得系统分辨率

Andorid.util 包下的DisplayMetrics 类提供了一种关于显示的通用信息,如显示大小,分辨率和字体。

获得屏幕分辨率代码如下:

MainActivity.java内容如下:

package com.linutest.exa1;

import android.app.Activity;

import android.os.Bundle;

import android.util.DisplayMetrics;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {

    private Button bt_btn;

    TextView mTextView1 = null;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mTextView1= (TextView) findViewById(R.id.tv_5);

        bt_btn = (Button) findViewById(R.id.bt_btns);

        bt_btn.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View arg0) {

                DisplayMetrics metrics=new DisplayMetrics();

                getWindowManager().getDefaultDisplay().getMetrics(metrics);

                int W = metrics.widthPixels;

                int H = metrics.heightPixels;

                Log.i("Main", "Width = " + W);

                Log.i("Main", "Height = " + H);

                mTextView1.setText("Width = " + W +"Height = " + H);

            }

        });

        

        

    }

    

    

}

=============================================================

布局文件activity_main.xml内容如下:

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <Button

        android:id="@+id/bt_btns"

        android:layout_width="130dp"

        android:layout_height="40dp"

        android:gravity="center"

        android:background="#ff0000"

        android:text="点击按钮"

      

        />

    <EditText

        android:id="@+id/tv_5"

        android:layout_width="match_parent"

        android:layout_height="50dp"

        android:layout_marginTop="5dp"

        android:hint="分辨率为:" />

    

</LinearLayout >

运行效果:

模拟器图片



小米4c真机运行效果如下:



控件尺寸函数:

看看API reference里的解释:

getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。
getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。
getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入哦)。

可见getDimension和getDimensionPixelOffset的功能差不多,都是获取某个dimen的值,如果是dp或sp的单位,将其乘以density,如果是px,则不乘;两个函数的区别是一个返回float,一个返回int.

getDimensionPixelSize则不管写的是dp还是sp还是px,都会乘以denstiy.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android开发