免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1654 | 回复: 1
打印 上一主题 下一主题

android 屏幕适配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-12 20:48 |只看该作者 |倒序浏览
android 屏幕适配问题





如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情。

  

首先:你需要在 AndroidManifest.xml 文件的 <manifest> 元素如下添加子元素
  1. < supports-screens android:largeScreens = "true"

  2.        android:normalScreens = "true" android:anyDensity = "true"

  3.        android:smallScreens = "true" ></ supports-screens >
复制代码
名如其意,以上是为我们的屏幕设置多分辨率支持(更准确的说是适配大、中、小三种密度)。 android:anyDensity = "true" , 这一句对整个的屏幕都起着十分重要的作用,值为 true ,我们的应用程序当安装在不同密度的手机上时,程序会分别加载 hdpi,mdpi,ldpi 文件夹中的资源。

相反,如果值设置为 false ,即使我们在 hdpi,mdpi,ldpi 文件夹下拥有同一种资源,那么应用 也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部 240 × 320 像素的手机,如果设置 android:anyDensity = "false" , Android 系统会将 240 x 320( 低密度 ) 转换为 320 × 480( 中密度 ) ,这样的话,应用 就会在小密度手机上加载 mdpi 文件中的资源。

  

2. 细心的人会发现自 android2.0 开始之后 drawable 文件被三个文件夹 drawable-hdpi,drawable-mdpi,drawable-ldpi 三个文件夹所取代,有些编程人员为了让应用程序默认地加载某些图片,他们会特意地去在 android2.0 之后的应用程序中重新创建 drawable 文件夹,其实这样做完全没有必要,通过第一段的分析我们得知, android:anyDensity = "false" , 则应用会将大小密度转变成中密度,从而去加载 mdpi 中的资源。这里同样,当 android:anyDensity = "false" , 则应用会去加载 mdpi 中的资源。

总结一下:

第一: android:anyDensity = "true" , 系统会依据屏幕密度,自动去找对应的文件夹

第二: android:anyDensity = "false",

(1)              如果 drawable-hdpi,drawable-mdpi,drawable-ldpi 三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载 drawable_mdpi 文件夹中的资源

(2)              如果 drawable-hpdi 中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载 drawable-hdpi 中的资源。

(3)              如果 drawable-hdpi,drawable-mdpi 中有图片资源, drawable-ldpi 中没有对应的图片资源,那么系统会加载 drawable-mdpi 文件夹中的资源

  

3. 注意上图各种文件夹的不同表示。

drawable-hdpi 该图片即适用于横屏,也适用于竖屏

drawable-land-hdpi, 当屏幕为横屏,且为高密度时,加载此文件夹中的资源

drawable-port-hdpi, 当屏幕为竖屏,且为高密度时,加载此文件夹中的资源

  

3. 有时候会根据需要在代码中动态地设置某个值,比如地图,地图的 pin 和地图的地址提示框 的相对偏移量在不同密度的手机上是不同的。这时候可以通过以下方法求出屏幕密度:
  1. DisplayMetrics metric = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metric);

  3. int densityDpi = metric.densityDpi;  // 屏幕密度 DPI ( 120 / 160 / 240 )
复制代码
然后可以在代码中为这几种密度分别设置便宜量

  

但是这种方法最好不要使用,最好的方式是在 xml 文件中不同密度的手机进行分别设置。

这里地图的偏移量可以在 values-hpdi,values-mdpi,values-ldpi 三种文件夹中的 dimens.xml 文件进行设置

值得一提的是:
  1.     < dimen name = "bitmap_common_topoffset" > 40dp </ dimen >

  2.     < dimen name = "bitmap_common_bottomoffset" > -14dp </ dimen >
复制代码
这里的负数是完全起作用的,系统会认为它是一个负值




4. 各大手机厂商对于Android操作系统都有或多或少的改动,当然这些改动会对我们应用程序产生某些影响

  比如:

   (1)系统源代码中连接music服务的aidl文件所在包名:com.android.music  

   (2)LG则可能将该aidl文件修改所在的包(例如修改为 com.android.music.player),并且修改其中的文件内容(增加一个方法,或者减少几个方法,或者修改方法名称) 那么我们的应用要想在LG的手机上发布,那么我们就必须改变所要连接的aidl文件,必须跟LG厂商修改的完全一致。

   

5. 国际化问题.

   有时候在xml中设置了相应的语言,但是为什么当我们更改语言之后,UI显示仍然不起作用?

   不要怀疑是系统出了问题,这与我们在代码中引用values/string.xml中字符串的方式有关。

   错误的方式:

   1. 声明全局变量 private static String tempStr;

   2. 在onCreate方法中对该变量赋值 tempStr = context.getString(R.string.test);

   3. 在更新UI的方法(非onCreate方法)中引用该变量。 textView.setText(tempStr);

   原因是由于,当修改本地语言时,onCreate不会再被执行一遍. 变量tempStr 依然会使用页面刚启动时加载的默认英语。




   正确的方式:

   直接进行第三步:textView.setText( context.getString(R.string.test) );

论坛徽章:
0
2 [报告]
发表于 2011-11-14 10:23 |只看该作者
高手...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP