Android 手机屏幕适配解决办法

0. 前言

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

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52690498

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手机根据像素密度,可以分为以下几种屏幕密度类型:

(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/480 return (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)、wrap_content、match_parent和weight来控制布局。使用权重weight在任何设备上均会完美适配。

(3)为不同屏幕尺寸的设备设计不同的布局,通过配置限定符使得程序在运行时根据当前设备的尺寸自动加载合适的布局资源。

比如我们先写两个布局文件,分别为:

适配手机的布局(默认):res/layout/main.xml

适配尺寸>7寸平板的布局:res/layout/main_pb.xml

然后加入以下两个文件,系统会根据Android版本自动选择使用哪个布局配置文件。

//适配Android 3.2之前的平板布局 res/values-large/layout.xml <resources> <item name="main" type="layout">@layout/main_pb</item> </resources> //适配Android 3.2之后的平板布局 res/values-sw600dp/layout.xml <resources> <item name="main" type="layout">@layout/main_pb</item> </resources>

上述两个配置文件,并没有真正去定义布局,它们仅仅是将main设置成了@layout/main_pb的别名。

如果不这样做,main_pb.xml布局文件的内容需要复制成两份分别放入res/layout-large/main.xml和res/layout-sw600dp/main.xml以适配3.2以前和以后,这样明显很冗余。

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)代码适配的另一个使用场景是根据加载布局的不同,来决定走不同的流程,如下:

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-08-08 05:57:39

Android 手机屏幕适配解决办法的相关文章

Android 手机屏幕适配解决办法_Android

0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博客,并对这一问题做一个总结,力求精简明了. 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52690498 1. 基础概念 (1)屏幕尺寸,即手机对角线的物理尺寸 1英寸 = 2.54cm  常见手机尺寸有5英寸.5.5英寸.6英寸等

手机屏幕失灵怎么解决 手机屏幕失灵解决办法

导致 手机屏幕失灵的原因有很多种了,我们可以从各方面来排除了,下面小编和大家一起来看看. 电容屏幕失灵就是因为表面局部带电荷,通俗来讲就是大家所说的带静电,导致无法判断是否有手指或其它导体(比如电容笔)按在上面.放在兜里摩擦.经常用大力按.屏幕带灰尘.手上汗多或者冬季干燥人体本身带静电等等都有可能导致屏幕局部荷电.而除了冬季干燥导致人体本身带静电外,温度也是一个重要的因素,电容屏有较为严格的使用条件,例如温度.湿度等,理论上电容屏的使用环境温度要求在0-35℃.而冬天北方温度普遍要低于0℃,自然

Android ScrollView无法填充满屏幕的解决办法

Android ScrollView无法填充满屏幕的解决办法 ScrollView滚动视图是指当拥有很多内容.屏幕显示不完时.需要通过滚动跳来显示的视图.Scrollview的一般用法如下 以下代码在Scrollview里面放了一个RelativeLayout.并且是设置为Android:layout_height="match_parent"填充全屏的和RelativeLayout里面放置了一个TextView背景设为了一张图片.按照代码理解.图片应该是居于屏幕的最下方的 <S

了解真实的『REM』手机屏幕适配

rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The font size of the root element.』,即以根节点的字体大小作为基准值进行长度计算.一般认为网页中的根节点是 html 元素,所以采用的方式也是通过设置 html 元素的 font-size 来做屏幕适配,但实际情况真有这么简单吗? 首先我们来看看使用 rem 实现手机屏幕适

lcd-关于android手机屏幕驱动的几个小问题

问题描述 关于android手机屏幕驱动的几个小问题 看到这样的一句话:DISPC刷新帧率过高,D-PHY frequency设置的过低 这里的dispc和D-PHY frequency分别是指什么,dispc是什么控制器? 在调试 DSI 或者 CSI 的时候, 一般遵循的原则为:Host 端的 T_HS-SETTLE > Slave 端的 T_HS-SETTLE.这里的host和slave这两个一般是在哪里设置的额? 解决方案 DISPC应该是指AP端吧,刷新率一般都固定在60. D-PHY

Android手机屏幕录像方法

  一个Android手机屏幕录像的软件了,使用也非常方便,在此贡献给大家 虽然论坛上已经有了安致手机截屏的软件,使用也很方便.但是有时候视频演示效果会很好.今天在googlecode上发现了一个好用的在windows.linux和mac下都能使用的捕获视频的工具: http://code.google.com/p/androidscreencast/ 使用java web start技术,因此可以通过浏览器直接使用.   左边是程序录制的界面,右边是视频播放的界面.效果不错. 使用很简单: 首

Android开发之Ruby实现Android自动化屏幕适配

背景:我相信对于Android开发者来说,屏幕适配一直是你心中的痛-,为了让Android开发者从屏幕适配的痛苦中解脱出来,我决定实现这个Android自动化屏幕适配的1.0版本.下面来讲一下思路. 首先以values-w360作为标准也就是360dp,对应的设备就是720×1080俗称的720P的屏幕,也就是说设计师给的设计稿是以720P的屏幕作为设计图的,那么如果设计图上面的尺寸是100px,那么我们就需要用100/2 = 50dp得到我们的这个标准值,以此类推,将app中所有需要适配的尺寸

完美刷机手机变砖怎么办 刷机手机变砖解决办法

准备工个 就是你的坏手机一台了,然后手机数据线及电脑,再者就是完美刷机工具安装在电脑中. 刷机手机变砖解决办法   1.启动软件,确认救砖.双击软件图标启动软件,手机变砖时连接软件没有明显反应.     2.点击页面上方的"变砖修复"按钮,出现软件目前支持的手机品牌,点击"Samsung"按钮,从页面出现的三星系列手机图标中找到"三星I9100"并点击,之后弹出对话框来询问是否要进行手机救砖,选择"确定       注意:完美刷机智能识

安卓(Android)手机屏幕锁密码忘记了找回方法

准备工作 电脑一台,手机一台 解决办法 1.先在电脑中安装[刷机大师],如果不知道可以百度搜索下载[立即下载].   2.下载之后安装在电脑中,我点击下载包然后点击[立即安装]选择安装在电脑中位置[开始安装],安装过程很快,安装好后点击[立即启动]即可.     3.我们先把安装好的刷机大师打开,然后把你手机用USB数据线与电脑连接,然后等待刷机大师发现手机,我们如下图点击[更多工具]. 4.在这里我会看到有一个[清楚锁屏密码].   5.我们点击清楚锁屏密码等待刷机大师清楚锁屏密码,清除后会提