Android开发——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...
}
至此关于屏幕适配的问题整理完毕
转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52690498
Android开发——Android手机屏幕适配方案总结的更多相关文章
- Android 开发中的屏幕适配技术详解
本文主要介绍Android开发中比较头疼繁琐的一个问题-屏幕适配问题.主要从适配原因.基本核心概念.适配方法等方面介详细 介绍从而是的深入或者进一步对Android屏幕适配技术的掌握和理解. 真题园网 ...
- Android 屏幕适配方案
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...
- 实用Android 屏幕适配方案分享
转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...
- android屏幕适配方案
曾经看了android的屏幕适配方案,有非常多种.当中自己用到的一种是:先找一款主流的分辨率的android机,如:1080*1920的分辨率做基准,然后在这个基准上.调整好一切布局.图片.适配其它手 ...
- Python 制作Android开发 所需的适配不同分辨率的套图
使用Python做起工具来还真是爽,简单,方便,快捷.今天忙活了一下,制作出一个比较实用的小工具. 自动化套图制作,适配不同屏幕 尤其是对于android开发来说,要适配不同屏幕就需要多套切图,那么. ...
- Android 如何将手机屏幕投影到 PC 屏幕上或者投影仪上做演示?
Android 如何将手机屏幕投影到 PC 屏幕上或者投影仪上做演示? 公司开发款APP,要给领导演示,总不能用手机面对面演示吧.所以找了好久,找到一款体验超好的: Total Control-帮助你 ...
- android 中webview的屏幕适配问题
两行代码解决WebView的屏幕适配问题 一个简单的方法,让网页快速适应手机屏幕,代码如下 1 2 WebSettings webSettings= webView.getSettings(); we ...
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
- 了解真实的『REM』手机屏幕适配
rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...
随机推荐
- PHP Swoole 基于纯真IP库根据IP匹配城市
把纯真IP库读到内存,纯真IP库本来就是有序的,然后每次请求二分查找就行,44WIP查找十几次就搞定了 dispatch_mode最好写3,不然做服务的时候,会导致进程任务分配不均匀. max_req ...
- (转)写的非常好的一篇HTTP协议详解
原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html#3931004(推荐看原文,因为原文文章末有更详细链接) 当今 ...
- Ural State University Internal Contest October'2000 Junior Session
POJ 上的一套水题,哈哈~~~,最后一题很恶心,不想写了~~~ Rope Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7 ...
- selenium定位学习回顾
之前已经专门学过了定位,但后来因为浏览器比较方便,可以直接复制xpath和css进行定位,个人觉得自己快遗忘了这块,所以专门来回顾一下, 顺便记录一下,以便后期查看. 进行web页面自动化测试,对页面 ...
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(八)之 聊天记录入队(列)
本篇也算是个番外篇了,跟之前几篇关系不算大.之前一篇 RabbitMQ .NET Client 实战实验 里有介绍过今天要用的内容. 做了一下小更改,就是在用户聊天的时候,消息记录不直接进入数据库, ...
- VI编辑器查找替换
1.Vi下进行查找 VI命令模式下:输入“/要查找的词”回车就会进入查找,你可以按“n”查找下一个,按“N”查找上一个.类似查找命令“?”与“/”的区别是“/”为向下查找,“?”为向上查找. 2.Vi ...
- bootstrap-table表格导出
在bootstrap-table官网->拓展模块中有导出模块的详细介绍.网址:http://bootstrap-table.wenzhixin.net.cn/zh-cn/extensions/ ...
- 29.You executed the following command to perform a backup of the USERS tablespace:
29.You executed the following command to perform a backup of the USERS tablespace:SQL> ALTER TABL ...
- 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)
上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下. · Mysql mysql的分页可以直接使用关键字limit,句子写起来比较方便. 语法: ① limit m,n -- ...
- 关于SQLNET.AUTHENTICATION_SERVICES= (NTS) 的解释
原文转自:http://www.360doc.com/content/12/0207/12/3446769_184740592.shtml 标题所代表的意思为 使用操作系统本地验证,一般不 ...