由于不同手机的尺寸大小,屏幕分辨率可能存在差异。在开发应用的时候,你或许遇到过这些的问题:

1, 为什么图片在另外的手机上显示的时候变小了,又或是缩小了?

2, 为什么在layout中定义好的格局在另外的手机上变形了?

3, 为什么自己自定义的控件尺寸显示不正常了?

。。。。。。。。。。。。。。。。

这些都是android中比较常见的设备兼容性相关的问题,其实解决这类问题也不难,只要掌握了一些基本概念和android内部处理兼容性问的机制,这些问题都可以迎刃而解。

下边收集了一些关于尺寸兼容性问题的一些基本知识和一些best practices, 希望对大家能有所帮助

1,屏幕尺寸大小与密度参考值:

注解:1 inch = 2.5cm

密度基线: 160dpi

2, 屏幕尺寸与密度对照表:

3,px 与 dp 在不同分辨率设备上的转换规则:

一, 假如设备的尺寸是2英寸的,分辨率是320,那边它的密度为160dpi,也就是基本参考线。这时:1px=1dp=1sp.

二, 假如设备的尺寸是2英寸,分辨率是480, 那么它的密度是240/dp.这时:1.5px=1dp=1sp

换算规则px = dp(dpi/160).

这个可以解析为什么用dp作为长度单位时,即使屏幕分辨率发生变化,在不同的设备上显示的物理长度能保持一致。而用px作为单位时,在高分辨率的设备上图像变小,在低分辨率的设备上图像变大。

4,使用wrap_content, fill_parent, 或者 dp 来定义layout的尺寸大小。

使用dp来定义组件的尺寸的好处是:系统会根据设备dpi自动转换尺寸的大小。举个列子,在密度为160dpi的机器上,假如你定义组件的尺寸是100dp,那么显示的实际大小就是100px。而在密度为240的机器上,系统会把它显示成px=100 * (240/160) px= 150px大小的尺寸。通过这种转换,可以达到在不同分辨率的设备上,对于同一个组件,显示的物理尺寸是相同的,不会出现变大或者变小的情况。

5,不同密度设备对应图像文件的最佳比例。

对于四种密度low-dpi, medium-dpi, high-dpi, extra high-hdpi的设备,在指定一个相同的图像文件时,分配给各种密度的图像文件的尺寸应该符合以下比例:3:4:6:9. 也就是要符合密度比例(120:160:240:360).

举个列子,假如我们要在一个密度为160dpi的设备上使用到一个48 * 48的图像文件。那么对于其它密度的设备,我们要准备的图像文件分别是:

low-density (120dpi) : 36×36

medium-density(160dpi): 48×48

high-density (240dpi) : 72×72

high-density (360dpi): 96×96

6,在需要的情况下,为每种尺寸的设备提供指定的layout文件。

res/layout/my_layout.xml             // layout for normal screen size (“default”)

res/layout-small/my_layout.xml       // layout for small screen size

res/layout-large/my_layout.xml       // layout for large screen size

res/layout-xlarge/my_layout.xml      // layout for extra large screen size

res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

7, 在需要的情况下,为每种密度的设备提供不同的图像文件.

res/drawable-mdpi/my_icon.png        // bitmap for medium density

res/drawable-hdpi/my_icon.png        // bitmap for high density

res/drawable-xhdpi/my_icon.png       // bitmap for extra high density

8,不在layout文件中使用px。

因为使用px后会在分辨率不同的机器上显示成不同的物理尺寸。

9,不使用absoluteLayout 布局。

因为绝对布局需要指定绝对偏移量,在尺寸不同的机器上,可能出现问题。

,10,如何让我们自己写的控件可以配置长度和自适应所有设备:

在所有自定义控件中,都不要硬编码长度,宽度等尺寸;应该先根据基线160dpi调式得到控件在标准基线下控件的最佳值,假如设为width。然后通过density = getResources().getDisplayMetrics().density 获取当前设备相对于基线的缩放值,然后得到一个最佳值value = width * density. 在用这个值去绘制控件的UI。这样我们就可以在配置文件中随时改动控件的大小。

注解:density = getResources().getDisplayMetrics().density

这个值在不同密度的设备中返回不同的值:

160dpi:1

240dpi: 1.5

120dpi: 0.75

….类推

android最佳实践之设备兼容性的更多相关文章

  1. fir.im Weekly - 2016 年 Android 最佳实践列表

    2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...

  2. Atitit.嵌入式web 服务器 java android最佳实践

    Atitit.嵌入式web 服务器 java android最佳实践 1. Android4.4.21 2. 自己的webserver1 3. CyberHTTP for Java  cybergar ...

  3. 听说你还不会用Dagger2?Dagger2 For Android最佳实践教程

    前言 Dagger2是现在非常火的一个依赖注入框架,目前由Google维护,在Github上面已经有12K star了.Dagger2的入门门槛其实是比较高的,据了解,目前有很多Android工程师对 ...

  4. Android最佳实践指南

    Updated on 2016/1/6 修正了一些翻译段落欢迎转载,但请保留译者链接:http://www.jianshu.com/p/613d28a3c8a0 Lessons learned fro ...

  5. 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  6. 我的Android最佳实践之—— 常用的Intent.Action(转)

    1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putEx ...

  7. 我的Android最佳实践之—— 解决闪空界面问题

    进入应用时,由于应用的启动Activity都会有默认的theme,所以会跳一下原始界面,才启动我们定义的theme. 修改这个问题的方法,就是给应用启动的Activity设置一个空的theme.如下面 ...

  8. 我的Android最佳实践之—— ImageView中图片拉伸显示

    通过设置android:scaleType="fitXY"使得图片拉伸显示.补充:scaleType的属性有matrix(默认).center.centerCrop.centerI ...

  9. 我的Android最佳实践之—— Android启动画面的实现方法

    本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: ...

随机推荐

  1. DataTable转List<Model>通用类

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  2. centos7.2 yum安装lamp环境

    一.准备工作 1.   下载并安装centos7.2,配置好网络环境,确保centos能上网,可以获取到yum源. centos7.2的下载地址:http://pan.baidu.com/s/1eRT ...

  3. Linux下集群的搭建

    1.集群的简介: 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术. 如果一个事情 ...

  4. 17 网络客户端编程 - 《Python 核心编程》

  5. cnblogs美化及插件

    1.vp计数 http://www.amazingcounters.com 2.来源地图 http://clustrmaps.com 2.1来源地图 http://www.flagcounter.co ...

  6. UVALive 6665 Dragon’s Cruller --BFS,类八数码问题

    题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...

  7. 2014 Super Training #8 G Grouping --Tarjan求强连通分量

    原题:ZOJ 3795 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3795 题目大意:给定一个有向图,要求把点分为k个集 ...

  8. 第2章 面向对象的设计原则(SOLID):5_迪米特法则

    5. 迪米特法则(Law of Demeter,LoD) 5.1 定义 (1)应尽量减少其他对象之间的交互,对象只和自己的朋友交谈,即对其他依赖的类越少越好(不要和太多的类发生关系). (2)尽量不要 ...

  9. Linux平台Java调用so库-JNI使用例子

    1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数.如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/t ...

  10. css3高级运动keyframes

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...