android 屏幕适配

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

首先:你须要在AndroidManifest.xml文件的<manifest>元素以下添加子元素编程

<supports-screens android:largeScreens="true"spa

android:normalScreens="true" android:anyDensity="true"操作系统

android:smallScreens="true"></supports-screens>orm

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

相反,若是值设置为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中的资源。ci

总结一下:资源

第一: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和地图的地址提示框的相对偏移量在不一样密度的手机上是不一样的。这时候能够经过如下方法求出屏幕密度:

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);

int densityDpi = metric.densityDpi; // 屏幕密度DPI120 / 160 / 240

而后能够在代码中为这几种密度分别设置便宜量

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

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

值得一提的是:

<dimen name="bitmap_common_topoffset">40dp</dimen>

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

相关文章
相关标签/搜索