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

来源:互联网 发布:淘宝卖家衣服轮播图 编辑:程序博客网 时间:2024/06/08 00:38
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.



0 0
原创粉丝点击