android 屏幕自适应问题

 

这是我最近碰到的一个比较严重的问题,一直不能完美的解决。实在无奈之下,发帖到csdn android版提了一个问题,没想到惊动了版主,给了我很大的帮助,让我可以完美的解决类似问题。决定以后蹲点csdn android论坛了。呵呵。

 

问题描述:

在WVGA 854 设备上,图片大小自适应变化得到的是错误结果,在我的项目上就是 图片总会缩小。

比如说 854X90的图片在经过自适应的时候,图片宽度,高度会缩小1.5倍,这样就会导致显示的时候不能占满全屏。

 

问题分析:

我发现图片读取时正常的,是854x90,density 240也没问题,和真机时一致的。但在一句代码之后,density变成了160,高度,宽度同时缩小1.5倍。 这句代码就是 BitmapDrawable drawable = new BitmapDrawable(bitmap);

 

很快我发现这是因为density发生了变化,android会自动根据density来对图片进行自适应变化,从240 变 为 160,刚好是1.5倍,所以宽度,高度也相应的缩小1.5倍。

 

所以我确定问题是出在density上了,事实证明我的判断也是对的。

 

解决方案:

在查阅android开发文档后,发现从android 1.6开始才增加的根据density来自适应变化功能,而我们项目的api使用的是android 1.5。

1.5中没有提供相应的API来根据真机的density来自适应,而是使用了一个默认的density 160. 这也就解释了为什么我每次经过BitmapDrawable的时候density变成了 160.

 

在1.6文档说明中 我们项目中使用的api已经被deprected,而提供了根据resource来决定density的API接口

 

这是我们项目中使用的构造函数

BitmapDrawable (Bitmap bitmap)
This constructor is deprecated. Use BitmapDrawable(Resources, Bitmap) to ensure that the drawable has correctly set its target density.

 

查阅API doc之后,我采用了下面这个构造函数

 

BitmapDrawable (Resources res, Bitmap bitmap)
Create drawable from a bitmap, setting initial target density based on the display metrics of the resources.

 

这个api说明中明确说了,会跟根据真机的density来设置初始target density。

这样BitmapDrawable就会根据正确的density来对图片进行自适应变化。

 

调用这个构造函数中的第一个参数很容易获得,直接调用activity.getResources()就可以获得,第二个参数就是我们原始的map。

 

就此,这个问题成功解决。

 

大家有疑问的可以留言。

 

 

 

 

 

 

 

 

你可能感兴趣的:(android,api,文档,resources,Constructor)