android density 和款高度,Android Density(密度)

本文详细介绍了Android中的density概念,包括dpi的含义和不同屏幕密度下的对应关系。同时,文章讨论了分辨率与density的区别,并指出从Android 1.6版本开始支持density以解决跨设备适配问题。通过代码示例,展示了如何在AndroidManifest.xml中配置、资源目录的命名规则以及dp和px单位的使用。最后,提供了获取屏幕信息(如宽度、高度、密度)和状态栏、标题栏高度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、取得屏幕信息(宽高等)

Java代码 icon_copy.gif icon_star.png

spinner.gif

publicstaticString getDisplayMetrics(Context cx) {

String str ="";

DisplayMetrics dm =newDisplayMetrics();

dm = cx.getApplicationContext().getResources().getDisplayMetrics();

intscreenWidth = dm.widthPixels;

intscreenHeight = dm.heightPixels;

floatdensity = dm.density;

floatxdpi = dm.xdpi;

floatydpi = 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";

returnstr;

}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 取得状态栏和标题栏高度

Java代码 icon_copy.gif icon_star.png

spinner.gif

TextView tv1;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layout_test2);

tv1 = (TextView) findViewById(R.id.TextView01);

tv1.post(newRunnable(){

publicvoidrun()

{

processLayout();

}

});

}

privatevoidprocessLayout(){

Rect rect=newRect();

Window window= getWindow();

tv1.getWindowVisibleDisplayFrame(rect);

//状态栏高度

intstatusBarHeight= rect.top;

intcontentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();

//标题栏高度

inttitleBarHeight= contentViewTop - statusBarHeight;

//测试结果:ok之后 100多 ms 才运行了

Log.v("test","=-init-= statusBarHeight="+statusBarHeight+

" contentViewTop="+contentViewTop+

" titleBarHeight="+titleBarHeight);

}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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值