zoukankan      html  css  js  c++  java
  • android屏幕适配

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

     

    首先:你需要在AndroidManifest.xml文件的<manifest>元素如下添加子元素

    <supports-screens android:largeScreens="true"

           android:normalScreens="true" android:anyDensity="true"

           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和地图的地址提示框的相对偏移量在不同密度的手机上是不同的。这时候可以通过以下方法求出屏幕密度:

     

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


  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879668.html
Copyright © 2011-2022 走看看