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.