0. 前言

Android的屏幕适配,即使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题。本文参考了很多前人的博客,并对这一问题做一个总结,力求精简明了。

转载请注明出处:Android开发——Android手机屏幕适配方案总结_SEU_Calvin的博客-CSDN博客

1. 基础概念(了解的直接过)

(1)屏幕尺寸,即手机对角线的物理尺寸

1英寸 = 2.54cm  常见手机尺寸有5英寸、5.5英寸、6英寸等。

(2)屏幕分辨率,即手机在横向、纵向上的像素点数总和(一般描述成屏幕的宽x高)

例如1080dpx1920dp,即宽度方向上有1080个像素点,在高度方向上有1920个像素点,1px=1像素点

Android手机常见的分辨率:320x480、480x800、720x1280、1080x1920

(3)屏幕像素密度,即每英寸的像素点数,单位dpi

例如某设备为240x320,屏幕尺寸为3.3英寸,那么该设备的屏幕像素密度为400/3.3=120dpi,其中400为通过宽高像素勾股定理得出。

Android手机根据像素密度,可以分为以下几种屏幕密度类型,以及不同的dpi范围对应的密度类型。

(4)密度无关像素,单位为dp,是Android特有的单位

Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果。

/*** dp与px的转换* Created by SEU_Calvin on 2016/09/28*/
public class DensityUtils {public static int dp2px(float dp , Context context){float density = context.getResources().getDisplayMetrics().density;//即表中的0.75/1/1.5/2/3//context.getResources().getDisplayMetrics().densityDpi //即表中的120/160/240/320/480return (int)(dp * density + 0.5f);}public static float px2dp(int px , Context context){float density = context.getResources().getDisplayMetrics().density;return px/density;}
}

(5)独立比例像素,单位为sp,Android开发时用于设置文字大小的单位

可根据字体大小首选项进行缩放,推荐使用12/14/18/22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题。

介绍了上述基础概念,我们接下来从布局适配、图片适配、以及代码适配三个角度分别介绍屏幕适配的解决方案。

2.  布局方面适配

(1)推荐使用相对布局,禁用绝对布局。因为相对布局在屏幕的大小改变时视图之间的相对位置不会变化。

(2)使用dp和sp(尽量不用px像素,因为dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小)、match_parent和weight权重来控制布局。(权重weight在任何设备上均完美适配,但是weigth只能在LinearLayout中使用)

(3)为不同屏幕尺寸的设备设计不同的布局,如res/layout-800x480/xxx.xml。程序在运行时根据当前设备的尺寸自动加载合适的布局资源。

3. 图片适配

(1)比如有一个这样的需求,一个按钮的背景图片必须能够随着按钮大小的改变而改变。

使用普通的图片将无法实现上述功能,因为运行时会均匀地拉伸或压缩你的图片。这时候可以使用Nine-Patch图(一种被特殊处理过的PNG图片,使用.9.png后名)。9Patch图可以指定图片的拉伸区域和非拉伸区域,在需要拉伸图片时,系统就会自动地拉伸你想要拉伸的部分。

需要注意的是,.9图不需要多个分辨率的图片,放在drawable文件夹即可。

红色框区域:表示纵向拉伸的区域,也就是说,当图片需要纵向拉伸的时候它会只指定拉伸红色区域。

绿色框区域:表示横向拉伸的区域,也就是说,当图片需要横向拉伸的时候它会只指定拉伸绿色区域。

右边线以左区域代表纵向显示内容的区域。

下边线以上区域代表横向显示内容的区域。

(2)图片不需要在下图hdpi、mdpi等目录下都放入相对应的分辨率的图片,这样会使APK变大,一般只做1280*720一套图,放在hdpi或xhdpi下,若出问题再针对屏幕进行问题图片替换即可。另外对于如何减小APK大小,可以参考Android开发——减小APK大小。

3. 代码适配

(1)比如有一个需求,需要的宽度是屏幕的1/3。可以在代码中获取该机器的宽度:

/*** 代码适配例子* Created by SEU_Calvin on 2016/09/28*/
WindowManager wm = getWindowManager();
int width = wm.getDefaultDisplay().getWidth();
LinearLayout.LayoutParams params = (LayoutParams)tv.getLayoutParams();
params.width = width/3;
tv.setLayoutParams(params);

需要注意的是,一般代码适配需要写一个工具类(上文中已经贴出了)来实现dp2px ,因为代码里的参数一般都需要px值,需要通过不同设备的屏幕密度来实现dp2px。

(2)代码适配的另一个使用场景是,如在A机上需要有一个按钮,在B上就不需要有。那么根据屏幕分辨率加载不同布局后,在代码中根据该按钮是否为空来决定代码逻辑:

setContentView(R.layout.main_layout);//此处会根据屏幕大小加载不同的布局
Button btn = (Button)findViewById(R.id.btn);//其中一个布局没有该按钮
if(btn == null){  //业务逻辑1...
}else{  //业务逻辑2...
}

鸿神的一篇适配文章感觉很不错,http://blog.csdn.net/lmj623565791/article/details/45460089。

转载请注明出处:Android开发——Android手机屏幕适配方案总结_SEU_Calvin的博客-CSDN博客

Android开发——Android手机屏幕适配方案总结相关推荐

  1. android smallestWidth 限定符屏幕适配方案dimens.xml

    简介 smallestWidth 限定符适配方案 这个方案的的使用方式和我们平时在布局中引用 dimens 无异,核心点在于生成 dimens.xml 文件,但是已经有大神帮我们做了这 一步 ├── ...

  2. android开发获取手机屏幕分辨率

    android开发基础过程中获取手机屏幕分辨率用来加载不同的UI,图片等,如何获取手机屏幕分辨率? DisplayMetrics displayMetrics=new DisplayMetrics() ...

  3. Android开发时手机屏幕实时同步显示在电脑上

    1.下载 Android Screen Monitor http://code.google.com/p/android-screen-monitor/ (1) 下載 ASM_2_40.zip 并解压 ...

  4. android屏幕适配的目的,Android 不同分辨率下屏幕适配的实战方案与经验总结

    Android 开发中,屏幕适配是一大考点,几乎每一场面试,都不会落下这个问题,这个问题说简单也简单,说难也难,当然对于有过真实的适配经验的人来说,这个根本不算什么问题,从坑里爬过的人,自然知道这其中 ...

  5. android开发根据分辨率设置高度,最详细的Android屏幕适配方案分析

    为什么要屏幕适配 Android开发过程中我们常用的尺寸单位有px.dp,还有一种sp一般是用于字体的大小.但是因为px是像素单位,比方我们通常说的手机分辨例如1920*1080都是px的单位.现在A ...

  6. 2021年最详细的Android屏幕适配方案汇总

    1 Android屏幕适配的度量单位和相关概念 建议在阅读本文章之前,可以先阅读快乐李同学写的文章<Android屏幕适配的度量单位和相关概念>,这篇文章包含了阅读本文的一些基础知识,推荐 ...

  7. Android屏幕适配方案

    一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机适配主要包括三个方面:语言适配.屏幕适配.SDK平 ...

  8. Android 屏幕适配方案(七)

    原文地址为: Android 屏幕适配方案(七) 一. 手机适配的应用和使用场景 使android应用程序适用于不同的国家语言.型号.尺寸和SDK版本等手机环境中,其主要功能和界面风格保持不变. 手机 ...

  9. Android适配--最详细的限定符屏幕适配方案解析 附带values-Dimens文件生成工具

    屏幕适配 前言 适配缘由 相关概念 适配方案 db适配 设计最大分辨率图片 屏幕分辨率限定符(宽高限定符) dimens文件生成原理 使用样例1 使用样例2 dimens文件生成脚本 总结 最小宽度限 ...

最新文章

  1. 先来先服务算法代码_程序员算法与数据结构基础中的基础,栈与递归
  2. 开课吧python好吗-如何选择python培训机构?开课吧python培训怎么样?
  3. Oracle学习笔记:redo重做日志
  4. UA MATH564 概率论V 中心极限定理
  5. 最后解密的两弹元勋,众帅之帅朱光亚。
  6. django模型查询_如何在Django中编写有效的视图,模型和查询
  7. 领域驱动DDD原理简介与实践
  8. 转:c# 安装包制作
  9. Linux Shell学习-第二讲(进阶篇)
  10. IE浏览器无法查看源文件的8大原因
  11. VMware Funsion 8.5.1破解版
  12. 常用谷歌地址和常用搜索引擎
  13. InstallShield
  14. 【imx6ul】imx6ul上电boot rom启动过程
  15. Cypher语句-Create语句
  16. MOS管RC缓冲电路相关参数计算方法
  17. 小白也能看懂的Pandas实操演示教程(下)
  18. 我的世界手机版虚拟人生服务器,我的世界大型虚拟人生整合包
  19. Unity Shader - 水体交互
  20. P5-Windows与网络基础-安装GNS3软件环境

热门文章

  1. TL431及其常用电路
  2. 单件模式之可乐瓶实现
  3. 商家后台-商品录入【商品介绍】、富文本编辑器
  4. 硝烟四起!看三大移动操作系统终极较量
  5. 问渠那得清如许,唯有源头活水来
  6. JAD 文件的中文问题
  7. ADR4540ARZ小秘密
  8. 系统CPU负载过高、CPU使用率不高的问题
  9. 【数值分析学习笔记】——1、数值分析中的误差
  10. 什么叫软件架构师(转)