前言

Android设计之初就考虑到了UI在多平台的适配,它本身提供了一套完善的适配机制,随着版本的发展适配也越来越精确,UI适配主要受平台两个因素的影响:屏幕尺寸(屏幕的像素宽度及像素高度)和屏幕密度,针对不同的应用场景采用的适配方案也不一样,此文档仅针对Android4.0及以下版本

相关概念

分辨率:整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280x720,反之分辨率为1280x720的屏幕,像素宽度不一定为1280

屏幕密度:表示单位面积内的像素个数,通常用dpi为单位,即每英寸多少个像素点

px:长度单位,以具体像素为单位

dp:长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是:

1dp =

(目标屏幕密度/标准密度)*px,标准密度为160dpi,例如,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi的平台则表示1.5个像素的长度

屏幕尺寸:屏幕的大小,通常用屏幕对角线的长度表示

Android界面适配机制

UI界面在不同平台的适配受屏幕尺寸和屏幕密度影响,Android适配机制就是在资源后面添加对这两种因素的限定,通过不同的限定区分不同的平台资源,Android在使用资源的时候会优先选择满足本平台限定的资源,再找最接近条件的,再找默认(即不加限定),通过选择适合当前平台的资源来完成不同平台的适配。

屏幕尺寸分为:small,normal,large,xlarge分别表示小,中,大,超大屏

屏幕密度分为:ldpi,mdpi,hdpi,xhdpi,它们的标准值分别是:120dpi,160dpi,240dpi,320dpi

以上划分均表示的是一个范围:

在资源目录后面加上上面的限定就能为资源指定特定的适用平台,如下所示

表示大屏,中密度布局会选择上面那个main.xml,超大屏,中密度会选择下面那个main.xml

在实际开发过程中屏幕尺寸不够直观,android将其转换为分辨率表示,根据屏幕具体分辨率可选择相应的限定符

小结:通过加上上述限定可以实现一个apk适配几种主流的屏幕尺寸和屏幕密度,这种限定方式比较适用于对外发布应用,不知道终端具体参数的情况,但是不能做到精确适配,对于屏幕尺寸和密度相差不大的两种平台不能很好的区分。

为了解决上述问题,自Android3.2开始,引入了精确适配,理论上可以适配任意像素宽度,高度,屏幕密度的平台,需用以下方式添加限定符

其中w1280dp表示屏幕宽度为1280dp,h752dp表示屏幕高度为752dp,160dpi表示屏幕密度,其中屏幕宽,高必须以dp为单位,在知道屏幕像素宽高度的情况下可以通过公式:1dp

= (目标屏幕密度/标准密度)*px 转换成dp单位。

例如:某平台屏幕宽,高分别为1920px,720px,屏幕密度为240dpi

适配该平台的限定为:

或者

根据公式1dp=(240/160)px=1.5px,宽度,高度转为dp单位分别是1280dp和480dp.

1. 首先是建立多个layout文件夹(drawable也一样)。

在 在res目录下建立多个layout文件夹,文件夹名称为layout-800x480等。需要适应那种分辨率就写成什么。

注意:

a. 较大的数字要写在前面:比如layout-854x480而不能写layout-480x854.

b. 两个数字之前是小写字母x,而不是乘号。

2. 在不能的layout下调整layout 的长宽等各种设置。以适应不同的分辨率。

3 最后需要在AndroidManifest.xml里面添加下面一段,没有这一段自适应就不能实现:

android:largeScreens="true"

android:normalScreens="true"

android:anyDensity = "true"/>

在标签和 标签之间添加上面那段代码。即可

Android自适应不同分辨率或不同屏幕大小的layout布局(横屏|竖屏)

一:不同的layout

Android手机屏幕大小不一,有480x320, 640x360,

800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

二:hdpi、mdpi、ldpi

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

更正:应该是对应不同density 的图片

在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

[i]备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小。

[/i] 屏幕方向:

横屏竖屏自动切换:

可以在res目录下建立layout-port-800x600和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。

不同分辨率横屏竖屏自动切换:

以800x600为例 可以在res目录下建立layout-port-800x600和layout-land-800x600两个目录

不切换:

以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。

还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。

要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:

在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation="landscape"。 例如(landscape是横向,portrait是纵向):

Java代码:

package="com.ray.linkit" android:versionCode="1" android:versionName="1.0"> android:label="@string/app_name" android:screenOrientation="portrait"> android:screenOrientation="portrait"> android:screenOrientation="portrait">

另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!

有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。

而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的

onConfigurationChanged方法。实现方式如下,不需要做太多的内容:

@Override public void onConfigurationChanged(Configuration newConfig)

{ super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation ==

Configuration.ORIENTATION_LANDSCAPE) { // land do nothing is ok } else if (this.getResources().getConfiguration().orientation ==

Configuration.ORIENTATION_PORTRAIT) { // port do nothing is ok } }

写一个支持多分辨的程序,基于1.6开发的,建立了三个资源文件夹drawable-hdpi drawable-mdpi

drawable-ldpi,里面分别存放72*72 48*48

36*36的icon图标文件。当我在G1(1.5的系统)上测试时,图标应该自适应为48*48才对啊,但实际显示的是36*36。怎么才能让其自适应

48*48的icon图标呢

android多分辨率多密度,android多分辨率多密度下界面适配方案相关推荐

  1. Android 8.0 华为手机 桌面应用图标显示圆形适配方案

    Android 8.0的启动图标适配方案可以参考以下两篇文章 一篇是郭霖大神的Android应用图标微技巧,8.0系统中应用图标的适配 还有另外一篇:android8.0桌面图标适配以及相应问题的解决 ...

  2. android webview设置分辨率,Android WebView 设置参考

    mWebView.setHorizontalScrollBarEnabled(false);//水平不显示 mWebView.setScrollBarStyle(WebView.SCROLLBARS_ ...

  3. android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度

    为什么要适配,适配的好处等等这里就不说了,直接说我们要怎么适配,请看下面的内容. 1.重要概念 px:pixel,像素Android原生API,UI设计计量单位,如获取屏幕宽高. 屏幕分辨率:指在纵向 ...

  4. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

  5. android 屏幕分辨率 屏幕密度,android分辨率,屏幕尺寸,屏幕密度关系

    名词定义 分辨率 分辨率就是手机屏幕的像素点数,通常描述成屏幕的"宽×高",安卓手机屏幕常见的分辨率有480×800.720×1280.1080×1920等.720×1280表示此 ...

  6. Android 屏幕尺寸、屏幕分辨率(px)、屏幕像素密度(dpi)、密度无关像素(dp/dip)、屏幕适配

    1. dp , dpi , px 关系 (假设已经熟悉了基本概念,也可以参考最后的链接)  2. 运行时dp 如何转换成 px  3.  使用dp 和 px 设计结果比较 参考: Android屏幕适 ...

  7. Android 屏幕适配方案(多分辨率适配)

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  8. 【Android 屏幕适配】屏幕适配基础概念 ③ ( 屏幕像素密度 DPI 与素材大小关联 | 屏幕像素密度 DPI 与 屏幕密度限定符关联 )

    文章目录 一.屏幕像素密度 DPI 与素材大小关联 二.屏幕像素密度 DPI 与 屏幕密度限定符 xhdpi 关联 参考文档 : 设备兼容性概览 屏幕兼容性概览 支持不同的像素密度 声明受限屏幕支持 ...

  9. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子

    Android获取屏幕方向及键盘状态的小例子 复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (conf ...

最新文章

  1. 享乐不尽 聚 VR一体机艳冠群雄
  2. 第七章-NoSQL数据库
  3. Luntik and Subsequences 思维
  4. Java I/O体系原理
  5. 从对象角度阐释五行变化
  6. Expression Blend实例中文教程(13) - 控件模板快速入门ControlTemplates
  7. java中异常抛出后代码还会继续执行吗
  8. 添加列oracle默认值,Oracle 11g增加列,并带默认值的新特性
  9. 单结晶体管的导电特性_室温制备自愈合、可注射PEDOT:PSS导电水凝胶
  10. 解决办法:对‘operator delete(void*)’未定义的引用
  11. (二)面向对象设计原则
  12. 命令提示符操作及Java的特点
  13. 递归函数的例子python卖鸭子_递归算法实现卖鸭子
  14. 虚幻官方文档使用UMG(虚幻运动图像)的用户界面笔记[VS2019]
  15. 运行期间动态切换Redis数据库
  16. NDIM 磁力下载器 MAC多版本设置UA
  17. SAP一共有多少模块?
  18. 用友开发者社区 - http://udn.yonyou.com
  19. oracle virtualbox 共享文件,VirtualBox如何使用共享文件夹
  20. 财务大集中虚拟化解决方案

热门文章

  1. 浅谈BufferedReader中的read()方法和readLine()方法
  2. 关于Onehot编码的总结
  3. 计算机毕业设计Java-ssm便行顺风车出行系统源码+系统+数据库+lw文档
  4. PHP的几种加密解密算法
  5. 【算法专题】树的直径
  6. Learning Photoshop Portrait Retouching 学习Photoshop肖像修饰 Lynda课程中文字幕
  7. Promise学习笔记(下)
  8. vivado wdb文件 matlab,fft_ex1 基于verilog的FFT设计,使用vivado作为开发平台 VHDL-FPGA- 274万源代码下载- www.pudn.com...
  9. NR 5G新功能-极早寻呼指示(EPI)(R17版本)
  10. 发布职位:图森未来TuSimple# 4月份纳斯达克上市base 北上技术路线:激光雷达+毫米波雷达+摄像头 + 高级规划决策 + 高精地图前端后端软件大数据感知定位算法