1. 什么是density
引用
1) density
density表示每英寸有多少个显示点(逻辑值),它的单位是dpi:dot per inch,通常屏幕大时,density就大,屏幕小时,density就小,通常
屏幕实际分辨率为240px*400px时,density=120
屏幕实际分辨率为320px*533px,density=160
屏幕实际分辨率为480px*800px,density=240
2) 分辨率
是整个屏是多少点,比如800x480,它是软件的显示单位
3) 从Android1.6版本开始支持density(对应API Level 4)
用于解决应用在屏幕大小不同的硬件上正常显示的问题
2. 相关代码及设置
引用
1) AndroidManifest.xml
这个参数在API Level 4也就是SDK 1.6以后才启用的,而且1.6版本的API Level 4的应用默认值就是True
2) 资源目录名(android 2.0以后)
res/xxx-hdpi 当density为240时,使用此目录下的资源
res/xxx-mdpi 当density为160时,使用此目录下的资源
res/xxx-ldpi 当density为120时,使用此目录下的资源
res/xxx 不常后缀,为默认设置,同xxx-mdpi
3) 资源单位(xml文件中定义大小的单位)
a) dp=dip=dx (Density independent pixel)
基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个160dpi的屏幕,所有一个dp是160dpi屏幕上的一个点。
b) px
px指软件的单位点,设备相关的点
c) 具体使用
i.布局时尽量使用单位dip,少使用px
若使用px,如果设某控件大小400x400px,在800x480上显示正常,而在533x320的屏上就超出屏幕了
若使用dp,如果设某控件大小为160x160dp,就可以通过从系统中取density来算出真正的大小,比如在800x480屏的density设为240,而533x320屏的density设为160,借以下公式计算
pixels = dips * (density / 160)
在800x480在屏中显示240象素,而在533x320的屏中显示为160象素,控件在屏中显示的比例是一样的。
ii. 内部的处理过程分为三步:
取screen中其它元素,转为应用的值,计算应用各控件位置,然后再转成800x480以供真正显示
若res-xxx不存在,则读取res有的资源,然后对其做相应缩放
3. 实现density的关键源码
引用
1) BitmapFactory.java(用于缩放图片)
2) ComptibilityInfo.java(用于位置计算)
4、取得屏幕信息(宽高等)
public static String getDisplayMetrics(Context cx) {
String str = "";
DisplayMetrics dm = new DisplayMetrics();
dm = cx.getApplicationContext().getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
float density = dm.density;
float xdpi = dm.xdpi;
float ydpi = dm.ydpi;
str += "The absolute width:" + String.valueOf(screenWidth) + "pixels\n";
str += "The absolute heightin:" + String.valueOf(screenHeight)
+ "pixels\n";
str += "The logical density of the display.:" + String.valueOf(density)
+ "\n";
str += "X dimension :" + String.valueOf(xdpi) + "pixels per inch\n";
str += "Y dimension :" + String.valueOf(ydpi) + "pixels per inch\n";
return str;
}
5 取得状态栏和标题栏高度
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test2);
tv1 = (TextView) findViewById(R.id.TextView01);
tv1.post(new Runnable(){
public void run()
{
processLayout();
}
});
}
private void processLayout(){
Rect rect= new Rect();
Window window= getWindow();
tv1.getWindowVisibleDisplayFrame(rect);
//状态栏高度
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
//标题栏高度
int titleBarHeight= contentViewTop - statusBarHeight;
//测试结果:ok之后 100多 ms 才运行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
分享到:
相关推荐
修改density(屏幕密度,若每英寸有160像素点,该值就为1)、scaleDensity(字体缩放比例),densityDpi(屏幕上每英寸有多少像素点,如160)的值,就是修改系统内部对于目标尺寸而言的像素密度。 二、追根溯源 每个...
本文将深入探讨如何获取Android手机的屏幕宽度、屏幕高度、屏幕密度(density)、字体密度(font density)以及屏幕密度DPI。 首先,我们需要理解Android设备屏幕的基本概念: 1. 分辨率:指屏幕水平和垂直方向上的...
输入手机或平板的分辨率和尺寸即可自动计算其密度,以及其他配置: small normal large xlarge ldpi mdpi hdpi xhdpi xxhdpi nodpi
在本篇文章中,我们将深入探讨如何通过代码方式调整Android设备的屏幕密度,特别是利用`ro.sf.lcd_density=250`这一命令行来进行具体的设置。屏幕密度是衡量屏幕上像素点分布密集程度的一个指标,对于Android系统而...
android手机分辨率 密度 等各种信息 String str = " 手机屏幕分辨率为: " + widthPixels + "*" + heightPixels + " 屏幕密度为(像素比例:0.75/1.0/1.5/2.0): " + density + " 屏幕密度DPI(每寸像素:120/...
Android支持ldpi(低密度)、mdpi(中密度)、hdpi(高密度)、xhdpi(超高密度)、xxhdpi(双倍超高密度)等不同的资源目录,开发者可以为每个密度提供相应的图片资源。系统会根据设备的像素密度自动选择最合适的...
在Android开发中,理解和适配各种手机屏幕的大小和密度是非常关键的一环,因为不同的设备有着不同的屏幕参数,这直接影响到应用的显示效果和用户体验。本文将深入探讨如何获取手机屏幕的大小和密度,并以此为基础...
同时,也可以添加 screen density 限定,例如,hdpi, ldpi, mdpi, xhdpi 等,以适应不同的屏幕密度。 在实际开发过程中,屏幕尺寸不够直观,Android 将其转换为分辨率表示,根据屏幕具体分辨率可选择相应的限定符。...
Android 中有多种屏幕密度,包括 ldpi、mdpi、hdpi 等,每种密度对应着不同的屏幕分辨率和密度值。 * ldpi:density=120 * mdpi:density=160 * hdpi:density=240 获得设备的屏幕分辨率和屏幕密度 可以使用以下...
Android设备屏幕的分辨率和物理尺寸各异,为了确保应用界面在不同设备上呈现一致的效果,引入了密度无关像素(Density-independent Pixel, dp)的概念。1dp在不同密度的屏幕上代表相同的物理尺寸。Android定义了四种...
- **使用比例单位(dp和sp)**:dp(density-independent pixels)用于尺寸,sp(scale-independent pixels)用于字体大小,这两个单位会根据设备的像素密度进行自动缩放。 - **使用Android Studio的预览功能**:...
同时,Android也根据像素密度(DPI)将屏幕分为低密度(ldpi)、中密度(mdpi)、高密度(hdpi)、超高密度(xhdpi)和超超高密度(xxhdpi)等类别。开发者需要为不同的尺寸和密度提供相应的资源文件,以确保在不同...
Android系统根据屏幕的像素密度将其分为几个等级:低密度(ldpi)、中密度(mdpi)、高密度(hdpi)、超高清密度(xhdpi)、超高密度(xxhdpi)和超高超高密度(xxxhdpi)。每个密度级别都有一个对应的基准像素密度...
在Android中,dp(density-independent pixels)是一种与设备密度无关的度量单位,用于保持UI元素在不同分辨率的屏幕上的一致性。px 到 dp 的转换公式为: `dpValue = pxValue / density` 反之,dp 到 px 的转换...
`dm.density`是一个浮点数,表示屏幕的密度因子,它通常基于160dpi(每英寸160个像素,也称为MDPI或中等密度)的标准。例如,如果屏幕的实际像素宽度是480,而设备的密度是1.5(即HDPI),那么`dm.widthPixels`会...
"Density.zip"这个压缩包提供了一种解决方案,帮助开发者动态地修改应用的density属性,以便根据UI设计文档直接编写界面,避免手动计算dp(密度无关像素)与px(像素)的转换关系。 首先,我们需要理解Android中的...
Android定义了四种基本的DPI类别:低密度(LDPI)、中密度(MDPI)、高密度(HDPI)和超高清密度(XHDPI)。不同的DPI值会影响同一尺寸物体在屏幕上的大小。例如,1dp在MDPI屏幕上对应1px,而在HDPI屏幕上对应1.5px...
这篇资料主要关注的是如何获取和理解设备屏幕的相关属性,包括屏幕的宽度和高度,以及与像素密度(density)相关的px(像素)和dp(密度独立像素)单位之间的转换。这对于创建适应不同屏幕尺寸和密度的应用至关重要...
在"drawable-hdpi"这个文件夹中,我们看到的是针对高密度(High Density)屏幕的图标资源。Android系统将屏幕密度分为ldpi(低密度)、mdpi(中密度)、hdpi(高密度)、xhdpi(超高密度)和xxhdpi(超超高密度)等...
本文将详细探讨如何解决Android模拟器全屏的问题,并解释有关屏幕分辨率、密度与图片适配的重要知识点。 首先,全屏显示可以通过两种方法实现:在代码中设置或在AndroidManifest.xml配置文件中设置。以下是在代码中...