精华内容
下载资源
问答
  • 1.5是没有大屏幕的,所有的图片都放在了drawable下,但是1.6以上就有了大屏幕包括480*800 等这样就使得原来用1.5开发的些老项目受到了影响,具体表现就是界面不清晰。 如何解决这个问题,国外一个哥们这样写得...
    1.5是没有大屏幕的,所有的图片都放在了drawable下,但是1.6以上就有了大屏幕包括480*800 等这样就使得原来用1.5开发的些老项目受到了影响,具体表现就是界面不清晰。

    如何解决这个问题,国外一个哥们这样写得,使用-v的后缀,用1.6 或者更高版本的编译,然后声明支持1.5,指定支持的屏幕等,确实实现了,但是问题来了,与位置结合比较紧密的的怎么办?按照比例来,个人试了一下,效果不是很理想(特别是遇到自定义View的情况),估计得要对应开发相应的布局,(如果是自定义View的话有些估计得按照比例调整,这个就比较麻烦了),工作量和apk大小都直线上升。

    有的朋友使用穷举屏幕大小的方式获取图片,个人觉得未尝不可,但是代码维护起来就有点困难。

    如果我们去掉1.5的问题,支持1.6以上,在原来基础上怎么改呢?我不使用1.6默认的那种图片目录,还是用-v后缀的这种是比较好做的。(特别是以前有些动画效果的,并且代码中与坐标相关的比较多的。)具体做法就是吧drawable中的图片删掉,只在-v中放置大图片就可以了(自己独创的,有兴趣的可以自己试)。

    以上纯属个人见解,欢迎拍砖。
    --------------------------------------------------------
    题外话:我看到国内有两个应用实现了这种兼容,确切的说只有QQ,QQ确实很牛,不论是从技术还是用户体验来说,都非常值得学习。
    展开全文
  • 和你一起终身学习,这里是程序员AndroidAndroid设计用于运行在许多不同类型的设备上,从手机到平板电脑和...本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:设备兼容性分类硬...
    562c38258655cfe93ead48e3e2533f98.png

    和你一起终身学习,这里是程序员Android

    Android设计用于运行在许多不同类型的设备上,从手机到平板电脑和电视机。 作为开发人员,各种设备为您的应用程序提供了巨大的潜在受众。 为了使您的应用程序在所有这些设备上取得成功,APP应该容忍一些功能变化,并提供适应不同屏幕配置的灵活的用户界面。

    本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

    • 设备兼容性分类
    • 硬件设备兼容
    • 软件 APP 兼容
    • 兼容不同语言
    • 兼容不同分辨率
    • 兼容不同屏幕方向
    • 兼容不同硬件 Feature
    • 兼容不同SDK平台

    1. 设备兼容性分类

    兼容性分类主要分: 硬件兼容性,软件兼容性两大类。

    2. 硬件设备兼容

    不同厂商(比如:手机厂商)生产不同尺寸的设备,此时,设备要兼容不同类型的APP,Google也对此有强烈的要求,国外手机,必须通过CTS (兼容性测试)才可以上市售卖。国内手机由于没有预制GMS包,不用测试兼容性,故,有时候小厂商生产的手机在兼容性上可能不太完美。

    3. 软件 APP 兼容

    作为 APP开发者,APP兼容性是必须的。兼容不同Feature,兼容不同语言、兼容不同屏幕尺寸、兼容不同分辨率,兼容不同SDK版本等

    4. 兼容不同语言

    为了更加国际化,APP通常会兼容不同国家语言,最基本的是兼容英文,简体中文,繁体中文等

    1. 文件名称命名规则如下:

    values-ISO语言代码

    2 .使用语法:

    java :

    R.string. 引用字符串资源

    XML :

    @string/

    常用语言如下:

    简体中文 values-zh-rCN

    繁体中文 values-zh-rTW 、values-zh-rHK

    美式英文 values

    英文 values-en-rGB

    3. 兼容不同语言举例

    Android手机兼容不同国家的语言,进而更方便用户使用。

    3c8a2af5e2bfdf2ae4de07a11a026c5f.png

    Android兼容不同国家语言

    5.兼容不同分辨率

    Android 运行在不同的设备上,比如手机、TV、Car等设备载体。为了分类这些载体,Android设备分两大类:

    1. 屏幕大小

    物理尺寸上的大小 区分如下:

    small, normal, large, and xlarge

    2. 屏幕密度(DPI)

    屏幕像素的物理密度,区分如下:

    mdpi (medium), hdpi (hdpi), xhdpi (extra high), xxhdpi (extra-extra high), and others

    3. UI 标准化,常用图片兼容性总结

    开发过程中适应不同图片时候的参考总结

    密度建议尺寸手机屏幕密度DPI图片分辨率基准图缩放倍数drawable-mdpi48 * 48120dpi ~ 160dpi320x4801.0drawable-hdpi72 * 72160dpi ~ 240dpi480x800、480x8541.5drawable-xhdpi96 * 96240dpi ~ 320dpi960*7202.0drawable-xxhdpi144 * 144320dpi ~ 480dpi1280×7203.0drawable-xxxhdpi192 * 192480dpi ~ 640dpi1920*10804.0

    手机屏幕密度DPI获取方法

    float xdpi = getResources().getDisplayMetrics().xdpi;

    float ydpi = getResources().getDisplayMetrics().ydpi;

    4. 兼容屏幕分辨率举例

    93b2f1b0fcb3dc6043436482f0cf319a.png

    兼容不同屏幕分辨率

    d96ce5ffd2c07c4029fb40b074c3a949.png

    Android Studio推荐方法

    6. 兼容不同屏幕方向布局(横向 landscape 、纵向 portrait)

    虽然Android 在横竖屏切换的时候可以自适应,但是,效果经常不是太好,为了更好适应手机屏幕的旋转,横屏、竖屏需要不同的布局,进一步提升UI交互体验。

    兼容不同屏幕方向布局举例:

    布局适应屏幕layout默认纵向layout-land横向布局layout-large大屏纵向layout-large-land大屏横向layout-sw600dp双窗口布局,常用平板layout-sw600dp-land双窗口布局,常用横向 平板layout-sw720dp双窗口布局,常用平板

    a28d11c80ff3cad7173536fa3f2f4844.png

    兼容不同屏幕大小

    7. 兼容不同硬件 Feature

    为了兼顾不同的手机版本,在应用使用不同的Feature时候进行判断是否支持,这样会更好的提升用户体验。

    比如有些低配手机会没有陀螺仪等Feature,此时APK要兼容不容的硬件Feature。

    兼容 Feature 的使用方法

    例如:在AndroidManifest文件中声明使用Feature

    android:required="true" />

    ...

    然后在使用该Feature 功能时候进行判断取舍

    PackageManager pm = getPackageManager();if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { // This device does not have a compass, turn off the compass feature disableCompassFeature();}

    8. 兼容不同SDK平台

    不同的设备会运行在不同的Android版本上,比如Android 2.*、Android 4.* 、Android 5.* 、Android6.* 、Android 7.* 、Android 8.* 。

    创建工程时候,在AndroidManifest.xml文件中可以选择APP 要兼容的Android版本

     ...

    当然也可以在Java代码中动态判断当前设备版本,进而执行不同的代码。

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { // Running on something older than API level 11, so disable // the drag/drop features that use ClipboardManager APIs disableDragAndDrop();}
    展开全文
  •  由于Android设备的碎片特性,关于屏幕适配的话题一直绵绵不休,这篇文章是Android开发者官网的屏幕适配教程,算是非常官方的解决方案,我们可以从这里学到很多。  原文链接:...

    转载请注明出处:http://write.blog.csdn.net/postlist

        由于Android设备的碎片特性,关于屏幕适配的话题一直绵绵不休,这篇文章是Android开发者官网的屏幕适配教程,算是非常官方的解决方案,我们可以从这里学到很多。

        原文链接:http://developer.android.com/training/multiscreen/screensizes.html 

        转自:http://hukai.me/android-training-course-in-chinese/ui/multiscreen/screen-sizes.html 


    这节课教你如何通过以下几种方式支持多屏幕:

        ☞确保你的布局能自适应屏幕
        ☞根据你的屏幕配置提供合适的UI布局
        ☞确保你当前的布局适合当前的屏幕
        ☞提供合适的位图(bitmap)


        1.使用“wrap_content”和“match_parent”

        为了确保你的布局能灵活的适应不同的屏幕尺寸,针对一些view组件,你应该使用wrap_content和match_parent来设置他们的宽和高。如果你使用了wrap_content,view的宽和高会被设置为该view所包含的内容的大小值。如果是match_parent(在API 8之前是fill_parent)则被设置为该组件的父控件的大小。
        通过使用wrap_content和match_parent尺寸值代替硬编码的尺寸,你的视图将分别只使用控件所需要的空间或者被拓展以填充所有有效的空间。比如:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.     <LinearLayout android:layout_width="match_parent"  
    6.                   android:id="@+id/linearLayout1"  
    7.                   android:gravity="center"  
    8.                   android:layout_height="50dp">  
    9.         <ImageView android:id="@+id/imageView1"  
    10.                    android:layout_height="wrap_content"  
    11.                    android:layout_width="wrap_content"  
    12.                    android:src="@drawable/logo"  
    13.                    android:paddingRight="30dp"  
    14.                    android:layout_gravity="left"  
    15.                    android:layout_weight="0" />  
    16.         <View android:layout_height="wrap_content"  
    17.               android:id="@+id/view1"  
    18.               android:layout_width="wrap_content"  
    19.               android:layout_weight="1" />  
    20.         <Button android:id="@+id/categorybutton"  
    21.                 android:background="@drawable/button_bg"  
    22.                 android:layout_height="match_parent"  
    23.                 android:layout_weight="0"  
    24.                 android:layout_width="120dp"  
    25.                 style="@style/CategoryButtonStyle"/>  
    26.     </LinearLayout>  
    27.   
    28.     <fragment android:id="@+id/headlines"  
    29.               android:layout_height="fill_parent"  
    30.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    31.               android:layout_width="match_parent" />  
    32. </LinearLayout>  

        注意上面的例子使用wrap_content和match_parent来指定组件尺寸而不是使用固定的尺寸。这样就能使你的布局正确的适配不同的屏幕尺寸和屏幕配置(这里的配置主要是指屏幕的横竖屏切换)。

        例如,下图演示的就是该布局在竖屏和横屏模式下的效果,注意组件的尺寸是自动适应宽和高的。


        2.使用相对布局(RelativeLayout)

        你可以使用LinearLayout以及wrap_content和match_parent组合来构建复杂的布局,但是LinearLayout却不允许你精准的控制它子view的关系,子view在LinearLayout中只能简单一个接一个的排成行。如果你需要你的子view不只是简简单单的排成行的排列,更好的方法是使用RelativeLayout,它允许你指定你布局中控件与控件之间的关系,比如,你可以指定一个子view在左边,另一个则在屏幕的右边。

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.     <TextView  
    6.         android:id="@+id/label"  
    7.         android:layout_width="match_parent"  
    8.         android:layout_height="wrap_content"  
    9.         android:text="Type here:"/>  
    10.     <EditText  
    11.         android:id="@+id/entry"  
    12.         android:layout_width="match_parent"  
    13.         android:layout_height="wrap_content"  
    14.         android:layout_below="@id/label"/>  
    15.     <Button  
    16.         android:id="@+id/ok"  
    17.         android:layout_width="wrap_content"  
    18.         android:layout_height="wrap_content"  
    19.         android:layout_below="@id/entry"  
    20.         android:layout_alignParentRight="true"  
    21.         android:layout_marginLeft="10dp"  
    22.         android:text="OK" />  
    23.     <Button  
    24.         android:layout_width="wrap_content"  
    25.         android:layout_height="wrap_content"  
    26.         android:layout_toLeftOf="@id/ok"  
    27.         android:layout_alignTop="@id/ok"  
    28.         android:text="Cancel" />  
    29. </RelativeLayout>  

        3.使用据尺寸限定词

        这里的限定词只要是指在编写布局文件时,将布局文件放在加上类似large,sw600dp等这样限定词的文件夹中,以此来告诉系统根据屏幕选择对应的布局文件,比如下面例子的layout-large文件夹

        我们知道如何编写灵活的布局或者相对布局,它们都能通过拉伸或者填充控件来适应不同的屏幕,但是它们却无法为每个不同屏幕尺寸提供最好的用户体验。因此,你的应用不应该只是实现灵活的布局,同时也应该为不同的屏幕配置提供几种不同的布局方式。你可以通过配置限定(configuration qualifiers)来做这件事情,它能在运行时根据你当前设备的配置(比如不同的屏幕尺寸设计了不同的布局)来选择合适的资源。

        比如,很多应用都为大屏幕实现了“两个方框”模式(应用可能在一个方框中实现一个list,另外一个则实现list的content),平板和电视都是大到能在一个屏幕上适应两个方框,但是手机屏幕却只能单个显示。所以,如果你想实现这些布局,你就需要以下文件:

        res/layout/main.xml.单个方框(默认)布局:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.   
    6.     <fragment android:id="@+id/headlines"  
    7.               android:layout_height="fill_parent"  
    8.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    9.               android:layout_width="match_parent" />  
    10. </LinearLayout>  

        res/layout-large/main.xml,两个方框布局:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="fill_parent"  
    3.     android:layout_height="fill_parent"  
    4.     android:orientation="horizontal">  
    5.     <fragment android:id="@+id/headlines"  
    6.               android:layout_height="fill_parent"  
    7.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    8.               android:layout_width="400dp"  
    9.               android:layout_marginRight="10dp"/>  
    10.     <fragment android:id="@+id/article"  
    11.               android:layout_height="fill_parent"  
    12.               android:name="com.example.android.newsreader.ArticleFragment"  
    13.               android:layout_width="fill_parent" />  
    14. </LinearLayout>  
       
        注意第二个布局文件的目录名字“large qualifier”,在大尺寸的设备屏幕时(比如7寸平板或者其他大屏幕的设备)就会选择该布局文件,而其他比较小的设备则会选择没有限定词的另一个布局(也就是第一个布局文件)。


        4.使用最小宽度限定词

        在Android 3.2之前,开发者还有一个困难,那就是Android设备的“large”屏幕尺寸,其中包括Dell Streak(设备名称),老版Galaxy Tab和一般的7寸平板,有很多的应用都想针对这些不同的设备(比如5和7寸的设备)定义不同的布局,但是这些设备都被定义为了large尺寸屏幕。也是因为这个,所以Android在3.2的时候开始使用最小宽度限定词。

        最小宽度限定词允许你根据设备的最小宽度(dp单位)来指定不同布局。比如,传统的7寸平板最小宽度为600dp,如果你希望你的UI能够在这样的屏幕上显示两个方框(一个方框的显示在小屏幕上),你可以使用上节中提到的同样的两个布局文件,不同的是,使用sw600来指定两个方框的布局使用在最小宽度为600dp的设备上。

        res/layout/main.xml,单个方框(默认)布局:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.   
    6.     <fragment android:id="@+id/headlines"  
    7.               android:layout_height="fill_parent"  
    8.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    9.               android:layout_width="match_parent" />  
    10. </LinearLayout>  

        res/layout-sw600dp/main.xml,两个方框布局:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="fill_parent"  
    3.     android:layout_height="fill_parent"  
    4.     android:orientation="horizontal">  
    5.     <fragment android:id="@+id/headlines"  
    6.               android:layout_height="fill_parent"  
    7.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    8.               android:layout_width="400dp"  
    9.               android:layout_marginRight="10dp"/>  
    10.     <fragment android:id="@+id/article"  
    11.               android:layout_height="fill_parent"  
    12.               android:name="com.example.android.newsreader.ArticleFragment"  
    13.               android:layout_width="fill_parent" />  
    14. </LinearLayout>  

        这样意味着当你的设备的最小宽度等于600dp或者更大时,系统选择layout-sw600dp/main.xml(两个方框)的布局,而小一点的屏幕则会选择layout/main.xml(单个方框)的布局。 然而,在3.2之前的设备上,这样做并不是很好的选择。因为3.2之前还没有将sw600dp作为一个限定词出现,所以,你还是需要使用large限定词来做。因此,你还是应该要有一个布局文件名为res/layout-large/main.xml,和res/layout-sw600dp/main.xml一样。在下一节中,你将学到如何避免像这样出现重复的布局文件。


        5.使用布局别名

        最小宽度限定词只能在android3.2或者更高的版本上使用。因此,你还是需要使用抽象尺寸(small,normal,large,xlarge)来兼容以前的版本。比如,你想要将你的UI设计为在手机上只显示一个方框的布局,而在7寸平板或电视,或者其他大屏幕设备上显示多个方框的布局,你可能得提供这些文件:

    res/layout/main.xml:单个方框布局
    res/layout-large:多个方框布局
    res/layout-sw600dp:多个方框布局

        最后两个文件都是一样的,因为其中一个将会适配Android3.2的设备,而另外一个则会适配其他Android低版本的平板或者电视。 为了避免这些重复的文件(维护让人感觉头痛就是因为这个),你可以使用别名文件。比如,你可以定义如下布局: res/layout/main.xml,单个方框布局 res/layout/main_twopans.xml,两个方框布局 然后添加这两个文件:

        res/values-large/layout.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main" type="layout">@layout/main_twopanes</item>  
    3. </resources>  

        res/values-sw600dp/layout.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main" type="layout">@layout/main_twopanes</item>  
    3. </resources>  

        最后两个文件拥有相同的内容,但它们并没有真正意义上的定义布局。它们只是将main_twopanes设置成为了别名main,它们分别处在large和sw600dp选择器中,所以它们能适配Android任何版本的平板和电视(在3.2之前平板和电视可以直接匹配large,而3.2或者以上的则匹配sw600dp)。


        6.使用方向限定词

        有一些布局不管是在横向还是纵向的屏幕配置中都能显示的非常好,但是更多的时候,适当的调整一下会更好。在News Reader应用例子中,以下是布局在不同屏幕尺寸和方向的行为:

        小屏幕,纵向:一个方框加logo 小屏幕,横向:一个方框加logo 

        7寸平板,纵向:一个方框加action bar 

        7寸平板,横向:两个宽方框加action bar 

        10寸平板,纵向:两个窄方框加action bar 

        10寸平板,横向:两个宽方框加action bar 

        电视,横向:两个宽方框加action bar

        这些每个布局都会再res/layout目录下定义一个xml文件,如此,应用就能根据屏幕配置的变化根据别名匹配到对应的布局来适应屏幕。

        res/layout/onpane.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.   
    6.     <fragment android:id="@+id/headlines"  
    7.               android:layout_height="fill_parent"  
    8.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    9.               android:layout_width="match_parent" />  
    10. </LinearLayout>  

        res/layout/onepane_with_bar.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:orientation="vertical"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent">  
    5.     <LinearLayout android:layout_width="match_parent"  
    6.                   android:id="@+id/linearLayout1"  
    7.                   android:gravity="center"  
    8.                   android:layout_height="50dp">  
    9.         <ImageView android:id="@+id/imageView1"  
    10.                    android:layout_height="wrap_content"  
    11.                    android:layout_width="wrap_content"  
    12.                    android:src="@drawable/logo"  
    13.                    android:paddingRight="30dp"  
    14.                    android:layout_gravity="left"  
    15.                    android:layout_weight="0" />  
    16.         <View android:layout_height="wrap_content"  
    17.               android:id="@+id/view1"  
    18.               android:layout_width="wrap_content"  
    19.               android:layout_weight="1" />  
    20.         <Button android:id="@+id/categorybutton"  
    21.                 android:background="@drawable/button_bg"  
    22.                 android:layout_height="match_parent"  
    23.                 android:layout_weight="0"  
    24.                 android:layout_width="120dp"  
    25.                 style="@style/CategoryButtonStyle"/>  
    26.     </LinearLayout>  
    27.   
    28.     <fragment android:id="@+id/headlines"  
    29.               android:layout_height="fill_parent"  
    30.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    31.               android:layout_width="match_parent" />  
    32. </LinearLayout>  

        res/layout/twopanes.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="fill_parent"  
    3.     android:layout_height="fill_parent"  
    4.     android:orientation="horizontal">  
    5.     <fragment android:id="@+id/headlines"  
    6.               android:layout_height="fill_parent"  
    7.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    8.               android:layout_width="400dp"  
    9.               android:layout_marginRight="10dp"/>  
    10.     <fragment android:id="@+id/article"  
    11.               android:layout_height="fill_parent"  
    12.               android:name="com.example.android.newsreader.ArticleFragment"  
    13.               android:layout_width="fill_parent" />  
    14. </LinearLayout>  

        res/layout/twopanes_narrow.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    2.     android:layout_width="fill_parent"  
    3.     android:layout_height="fill_parent"  
    4.     android:orientation="horizontal">  
    5.     <fragment android:id="@+id/headlines"  
    6.               android:layout_height="fill_parent"  
    7.               android:name="com.example.android.newsreader.HeadlinesFragment"  
    8.               android:layout_width="200dp"  
    9.               android:layout_marginRight="10dp"/>  
    10.     <fragment android:id="@+id/article"  
    11.               android:layout_height="fill_parent"  
    12.               android:name="com.example.android.newsreader.ArticleFragment"  
    13.               android:layout_width="fill_parent" />  
    14. </LinearLayout>  

        现在所有可能的布局我们都已经定义了,唯一剩下的问题是使用方向限定词来匹配对应的布局给屏幕。这时候,你就可以使用布局别名的功能了:

        res/values/layouts.xml:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main_layout" type="layout">@layout/onepane_with_bar</item>  
    3.     <bool name="has_two_panes">false</bool>  
    4. </resources>  
        res/values-sw600dp-land/layouts.xml:
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main_layout" type="layout">@layout/twopanes</item>  
    3.     <bool name="has_two_panes">true</bool>  
    4. </resources>  
        res/values-sw600dp-port/layouts.xml:
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main_layout" type="layout">@layout/onepane</item>  
    3.     <bool name="has_two_panes">false</bool>  
    4. </resources>  
        res/values-large-land/layouts.xml:
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main_layout" type="layout">@layout/twopanes</item>  
    3.     <bool name="has_two_panes">true</bool>  
    4. </resources>  
        res/values-large-port/layouts.xml:
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
    1. <resources>  
    2.     <item name="main_layout" type="layout">@layout/twopanes_narrow</item>  
    3.     <bool name="has_two_panes">true</bool>  
    4. </resources>  

        7.使用.9.png图片

        支持不同的屏幕尺寸同时也意味着你的图片资源也必须能兼容不同的屏幕尺寸。比如,一个button的背景图片就必须要适应该button的各种形状。

        如果你在使用组件时可以改变图像的大小,你很快就会发现这是一个不明确的选择,因为运行的时候,图片会被拉伸或者压缩(这样容易造成图像失真)。避免这种情况的解决方案就是使用点9图片,这是一种能够指定哪些区域能够或者不能够拉伸的特殊png文件。

        因此,在设计的图像需要与组件一起变大变小时,一定要使用点9.若要将位图转换为点9,你可以用一个普通的图像开始(下图,是在4倍变焦情况下的图像显示)。


        你可以通过sdk中的draw9patch程序(位于tools/directory目录下)来画点9图片。通过沿左侧和顶部边框绘制像素来标记应该被拉伸的区域。也可以通过沿右侧和底部边界绘制像素来标记。就像下图所示一样:


        请注意,上图沿边界的黑色像素。在顶部边框和左边框的那些表明图像的可拉伸区域,右边和底部边框则表示内容应该放置的地方。
        此外,注意.9.png这个格式,你也必须用这个格式,因为框架会检测这是一个点9图片而不是一个普通图片。
        当你将这个应用到组件的背景的时候(通过设置android:background="@drawable/button"),android框架会自动正确的拉伸图像以适应按钮的大小,下图就是各种尺寸中的显示效果:

    展开全文
  • 为了方便,android把所有的屏幕尺寸分为了4个广义的大小:小,正常,,特大。 屏幕密度:屏幕的物理面积内像素的数量,通常称为DPI(每英寸点数)。为了方便,android把所有的实际屏幕密度分为:低,中,高,特高...

    关于手机分辨率相关术语和概念

    屏幕尺寸:实际的物理尺寸,屏幕的对角线测量。为了方便,android把所有的屏幕尺寸分为了4个广义的大小:小,正常,大,特大。

    屏幕密度:屏幕的物理面积内像素的数量,通常称为DPI(每英寸点数)。为了方便,android把所有的实际屏幕密度分为:低,中,高,特高。

    方向:从用户的角度来看,就是屏幕的方向,就是横向或者纵向的意义。

    分辨率:屏幕上面的物理像素总数。(官方说法,应用程序应该只关注屏幕大小和密度)

    密度无关像素: 一个虚拟像素单元(官方说法,你应该使用密度无关像素定义UI的布局,来表达布局尺寸或位置,系统默认假设“中等”的密度屏幕为基准,其屏幕密度相当于一个160dpi的屏幕。在运行时,系统根据实际中的屏幕密度对DP单位进行缩放。DP单位转换为屏幕像素可用PX = DP *(DPI / 160)这个方法。那么在一个160dpi屏幕上,1DP==1PX。在一个240 dpi屏幕上,1 DP==1.5PX。那么在定义布局时,应该使用DP单位,以确保不同密度的屏幕上合理的显示用户界面)

    关于支持屏幕的范围

    官方定义4种广义尺寸:小,正常, 大,更大。四种密度:低,中型, 高,特高。广义尺寸和密度都可以跨越一系列的尺寸和密度(官方截图上传不了权限不够一周<img title=”[android 屏幕适配]关于android分辨率兼容问题(一)[转]” src=”http://static.blog.csdn.net/xheditor/xheditor_emot/default/wronged.gif” alt=”委屈” />)

    关于密度的独立性

    官方说法保证密度的独立性是非常重要的,如果没有它,你应用程序中的系统控件可能会在物理尺寸相同,密度不同的屏幕上面显示异常。

    Android系统帮助密度独立有两种方式:

    1.使用DP单位。

    2.位图资源缩放,可以导致像素模糊的位图,可以根据当前屏幕密度,提供不同分辨率的位图。官方提示,如果提供一套图至少提供更高分辨率高密度的位图而不是提供哪些中等密度设计的位图。

    关于如何支持多个屏幕

    官方说法确保系统在适配多个屏幕做了很多工作,但是为了更妥善处理不同的屏幕配置,我们也需要做些工作:

    1.在程序中显示声明你的应用程序支持屏幕尺寸的清单。

    <span style=”font-family:KaiTi_GB2312;font-size:16px;”>
    android:resizeable=[“true”|”false”]
    android:smallScreens=[“true”|”false”]
    android:normalScreens=[“true”|”false”]
    android:largeScreens=[“true”|”false”]
    android:xlargeScreens=[“true”|”false”]
    android:anyDensity=[“true”|”false”]/></span>

    2.根据不同屏幕尺寸,提供不同布局

    默认情况下面,android会自动调整应用程序的布局,但是大多数情况下面,根据广义尺寸,小,正常,大,更大去增加不同的布局资源。比如,如果需要对大小为large的屏幕提供支持,需要在res目录下新建一个文件夹layout-large/并提供layout。当然,也可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。

    3.提供不同的屏幕密度和不同的位图drawables

    默认情况下面系统会自动调整和缩放位图,但是难免拉伸位图,为了保证你的位图是最好看的,根据广义密度,低,中型, 高,特高去添加不同的位图资源。比如,如需对密度为low的屏幕提供合适的图片,需新建文件夹drawable-ldpi/。应尽量使用点9格式的图片,图片大小的确定:low:medium:high:extra high比例为3:4:6:8。举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra high为96×96。

    关于系统怎么动态的寻找替代资源?

    1.系统根据当前的屏幕大小和密度,然后动态的采用程序中提供特定的资源。

    2.如果没有匹配的资源,系统会使用默认的资源进行缩放从而符合当前屏幕的资源,“默认”的资源是那些没有标签配置限定符。

    (这块只是简单的说法,详细关于介绍寻找替代资源下章在说吧)

    关于系统的资源配置的目录(我只列出一些大概,默认项目会有一些资源配置目录)

    Android系统支持多配置资源文件,我们可以追加新的资源目录到你的Android项目中。命名规范: 资源名字-限制符

    layout

    默认中等屏幕

    layout-small

    小屏幕

    layout-large

    大屏幕

    layout-xlarge

    特大屏幕

    layout-land

    横屏

    layout-port

    竖屏

    drawable

    默认中等密度

    drawable-hdpi

    高密度 ~240dpi

    drawable-mdpi

    中等密度 160dpi

    drawable-xhdpi

    更高密度 ~320dpi

    drawable-nodpi

    所有密度资源,无论什么密度屏幕都会适配。

    drawable-tvdpi

    介于mdpi~hdpi 约213dpi 主要应用在电视。

    注:如果没有指定横屏或竖屏,则上面的布局和位图都适配横竖屏。如果要指定横屏,例如:drawable-land-hdpi竖屏drawable-port-hdpi,还有关键是drawable-xlarge和layout-xlarge,对api level都要求在9之上,等于说,你用android2.2系统的平板或者手机根本不匹配layout-xlarge。因为api level是8。drawable-tvadpi这个api等级需要13以上。

    其实上面的layout-large这个目录其实是个范围。当系统根据当前屏幕的大小和密度,决定程序应该匹配那个目录。你也可以单独定制某些不符合谷歌标准的山寨版layout-l024x600(中间的符合是英文下的x字母),其中1024和600的单位是dp。你可以根据你设备的分辨率和密度,来判断你的设备需要定义那个文件。

    但是,官方推荐使用尺寸来表示资源layout-large,不推荐使用分辨率layout-1024*600。

    建议大家多看文档,官方说明:

    xlarge screens are at least 960dp x 720dp

    large screens are at least 640dp x 480dp

    normal screens are at least 470dp x 320dp

    small screens are at least 426dp x 320dp

    上面是定义广义大小布局资源适配的一个范围,大家可以根据自己的设备知道系统会匹配那个文件的布局。

    如果手上有个山寨华为的卖的比较火的mediapad,大家知道分辨率1280*800 密度尺寸7寸

    通过勾股定了和分辨率可以得出其密度为215.69。然后根据dp=px/(dpi/160),可以得出个范围593.471。所以这个设备系统会匹配layout-large这个资源布局文件。

    展开全文
  • Android 屏幕兼容

    2011-04-20 19:38:33
    [b]以下内容只是对Supporting Multiple Screens这部分文档的总结,只是对初...屏幕大小:以对角线的长度来衡量屏幕的大小 分辨率:屏幕上的像素个数。如320x480,就表示宽方向有320个像素,高方向有480个像素,整...
  • Android大屏幕适配demo

    2018-02-02 10:51:18
    Android大屏幕适配demo,这个是仿照郭林文章中的例子,他的例子是用eclipse写的,直接运行会不兼容最新的sdk,我改成了AndroidStudio可以直接运行的demo.郭林此代码文章的连接 ...
  • 由于Android设备的碎片特性,关于屏幕适配的话题一直绵绵不休,这篇文章是Android开发者官网的屏幕适配教程,算是非常官方的解决方案,我们可以从这里学到很多。 这节课教你如何通过以下几种方式支持多屏幕: ☞...
  • 无论是Android手机还是iOS手机,使用WebView加载一些没有专门为手机屏幕做适配的网页的时候,就会出现网页中的图片等标签元素的宽度大小和手机屏幕的宽度不一致的情况,如下图 之所以会出现上面的情况,是因为网页...
  • Android 屏幕兼容性理解

    千次阅读 2012-11-01 16:04:50
    屏幕大小:以对角线的长度来衡量屏幕的大小  分辨率:屏幕上的像素个数。如320x480,就表示宽方向有320个像素,高方向有480个像素,整个屏幕有153,600个像素。  宽高比:宽的物理长度/高的物理长度,如:6cm/8cm...
  • 这篇文章主要是对解决屏幕适配问题思路的总结,会比较抽象,以后逐步把每条步骤对应的【案例】总结上去。A:抛开【业务需求】,屏幕适配解决方案的本质是:1.动态控制控件的尺寸,2.动态控制视图布局。-1.动态控制...
  • Android屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机。因此要使我们的应用程序兼容不同屏幕尺寸,同一个应用就可以提供给更多的用户使用。一、支持不同的屏幕尺寸为了确保布局的灵活性,来适应不同...
  •  注意:如果你在低于安卓3.0的版本上进行应用开发,但其在更大屏幕的设备(比如平板电脑)上显示正常时,你就需要禁用屏幕兼任模式来保持最佳用户体验。要学习如何快速禁用用户选项,请跳转至禁用屏幕兼任模式。  ...
  • Android基础知识之屏幕兼容模式

    千次阅读 2013-07-17 14:48:54
    注意:如果你在低于安卓3.0的版本上进行应用开发,但其在更大屏幕的设备(比如平板电脑)上显示正常时,你就需要禁用屏幕兼任模式来保持最佳用户体验。要学习如何快速禁用用户选项,请跳转至禁用屏幕兼任模式。 ...
  • 移动app开发中多种设备尺寸适配问题,过去只属于Android阵营的头疼事儿,只是很多设计师...看看下面三款iPhone尺寸和分辨率数据就知道屏幕有多杂了。 加上Android生态中纷繁复杂的各种奇葩尺寸,现在APP设计开发...
  • 受限说点无关的google推荐...px为像素,像手机的480*800,720*1280等,图片的剪切,裁剪等也是一px为单位,但是它受手机影响较,布局容易出现混乱 dp为像素密度,比如480*800,4英寸的手机的像素密度为233,计算公式
  • android兼容oppo手机刘海屏解决方案

    万次阅读 2018-06-14 10:07:38
    《解决android刘海屏的全家桶》安卓兼容所有厂商的刘海屏解决方案,oppo沉浸式的兼容dujinyang,OPPO的刘海屏适配文档稍微比较简单点,首先认识一下OPPO推出的一款屏幕高宽比更、带有刘海的凹形屏幕的手机,其屏幕...
  • Android兼容不同设备

    2017-04-07 15:38:02
    我们都知道Android设备有着各种各样的大小和尺寸,为了能在各种Android平台上使用,我们的app需要兼容各种不同的设备类型。例如语言,屏幕尺寸,系统版本等重要的变量因素需要重点考虑。现在我就重要讨论语言,屏幕...
  • 要做好屏幕适配最重要的是了解当前市场设备分布,目前主流设备可以分为三类,4.7-5.5英寸的中屏手机,5.5-7.0的大屏手机,以及7.0英寸以上的平板。分辨率则是720P,1080P和2K。 看一下实际开发场景:比如现在一台5.0...
  • 兼容不同的屏幕大小

    2015-03-01 10:25:00
    由于Android设备的碎片特性,关于屏幕适配的话题一直绵绵不休,这篇文章是Android开发者官网的屏幕适配教程,算是非常官方的解决方案,我们可以从这里学到很多。 这节课教你如何通过以下几种方式支持多屏幕...
  • 1、使用密度独立像素(dp)一个dp代表一个密度独立像素,也就相当于在160 dpi(1英寸有160个像素点,1英寸为2.54厘米)的一个像素的物理尺寸,sp也是一...Android下设置文字大小用sp还是dp?https://www.jianshu.com...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 426
精华内容 170
关键字:

android兼容大屏幕