基本概念:

屏幕尺寸

屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米

比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

屏幕分辨率

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080。

屏幕像素密度

屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

dp、dip、dpi、sp、px

px我们应该是比较熟悉的,前面的分辨率就是用的像素为单位,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,像是获取屏幕宽高等。

dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。

假如同样都是画一条320px的线,在480*800分辨率手机上显示为2/3屏幕宽度,在320*480的手机上则占满了全屏,如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。这也是为什么在Android开发中,写布局的时候要尽量使用dp而不是px的原因。

而sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。

mdpi、hdpi、xdpi、xxdpi

其实之前还有个ldpi,但是随着移动设备配置的不断升级,这个像素密度的设备已经很罕见了,所在现在适配时不需考虑。

mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。

那么如何区分呢?Google官方指定按照下列标准进行区分:

在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

虽然 Android 也支持低像素密度 (LDPI) 的屏幕,但无需为此费神,系统会自动将 HDPI 尺寸的图标缩小到 1/2 进行匹配。

下图为图标的各个屏幕密度的对应尺寸:


适配方式之dp

在我们的 Android 工程目录中有如下 drawable-*dpi 目录,这些目录是用来适配不同分辨率手机的

Android 应用在查找图片资源时会根据其分辨率自动从不同的文件目录下查找(这本身就是 Android 系统的适配策略),如果在低分辨的文件目录中比如 drawable-mdpi 中没有图片资源,其他目录中都有,当我们将该应用部署到 mdpi 分辨率的手机上时,那么该应用会查找分辨率较高目录下的资源文件,如果较高分辨率目录下也没有资源则只好找较低目录中的资源了。


适配方式之 dimens

跟 drawable 目录类似的,在 Android 工程的 res 目录下有 values 目录,这个是默认的目录,同时为了适配不同尺寸手机我们可以创建一个 values-1280x720 的文件夹,同时将 dimens.xml 文件拷贝到该目录下。

在 dimens.xml 中定义一个尺寸,如下图所示

在 values-1280x720 目录中的 dimens.xml 中定义同样的尺寸名称,但是使用不同的尺寸,如下图所示。

当我们在布局文件中使用长或者宽度单位时,比如下图所示,应该使用@dimen/width 来灵活的定义宽度。

在 values-1280x720 中,中间的是大写字母 X 的小写形式 x,而不是加减乘除的乘号。如果我们在values-1280x720 中放置了 dimens 常量,一定记得也将该常量的对应值在 values 目录下的 dimens.xml 中放一份,因为该文件是默认配置, 当用户的手机不是 1280*720 的情况下系统应用使用的是默认 values 目录中的 dimens.xml。


适配方式之 layout

跟 values 一样,在 Android 工程目录中 layout 目录也支持类似 values 目录一样的适配,在 layout 中我们可以针对不同手机的分辨率制定不同的布局,如下图所示:


适配方式之 java 代码适配

为了演示用 java 代码控制适配的效果,因此假设有这样的需求,让一个 TextView 控件的宽和高分别为屏幕的宽和高的一半。
我们新创建一个 Android 工程,修改 main_activity.xml,布局文件清单如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<!-- 当前控件宽高为屏幕宽度的各 50% -->
<TextView
android:id="@+id/tv"
android:background="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>

在 MainActivity.java 类中完成用 java 代码控制 TextView 的布局效果,其代码清单如下:

public class MainActivity extends Activity {private static final String tag = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去掉 titlerequestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);//获取 TextView 控件TextView tv = (TextView) findViewById(R.id.tv);//找到当前控件的夫控件(父控件上给当前的子控件去设定一个规则)DisplayMetrics metrics = new DisplayMetrics();//给当前 metrics 去设置当前屏幕信息(宽(像素)高(像素))getWindowManager().getDefaultDisplay().getMetrics(metrics);//获取屏幕的高度和宽度Constant.srceenHeight = metrics.heightPixels;Constant.srceenWidth = metrics.widthPixels;//日志输出屏幕的高度和宽度Log.i(tag, "Constant.srceenHeight = "+Constant.srceenHeight);Log.i(tag, "Constant.srceenWidth = "+Constant.srceenWidth);//宽高各 50%RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(//数学角度上 四舍五入(int)(Constant.srceenWidth*0.5+0.5),(int)(Constant.srceenHeight*0.5+0.5));//给 tv 控件设置布局参数tv.setLayoutParams(layoutParams);}
}

其中 Constant 类是一个常量类,很简单,只有两个常量用来记录屏幕的宽和高,其代码清单如下:

public class Constant {public static int srceenHeight;public static int srceenWidth;
}


适配方式之 weight 权重适配

在控件中使用属性 android:layout_weight="1"可以起到适配效果,但
1、只能用在线性控件中,比如 LinearLayout。
2、竖直方向上使用权重的控件高度必须为 0dp(Google 官方的推荐用法)
3、水平方向上使用权重的控件宽度必须为 0dp(Google 官方的推荐用法)

转载于:https://www.cnblogs.com/loaderman/p/6497237.html

屏幕适配方式都有哪些相关推荐

  1. 重磅!骚年你的屏幕适配方式该升级了,面试真题解析

    本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: 音视频是什么,视频为什么需要压缩 心理分析:很多人对音视频的概念停留在 苍老师的小电影上,只能理解他是一个视频文件 ...

  2. 快速学会!骚年你的屏幕适配方式该升级了,赶紧收藏!

    开头 开发上线的版本能保证不存在Bug么? 修复后的版本能保证用户都及时更新么? 如何最大化减少线上Bug对业务的影响? 热修复技术帮助我们解决了很多问题,带来的优势不言而喻.不知道各位对于热修复技术 ...

  3. Android实习面试经验汇总,骚年你的屏幕适配方式该升级了

    前言 从17年毕业至今,就职过几家公司,大大小小项目做了几个,非常感谢我的两位老大,在我的android成长路上给予我很多指导,亦师亦友的关系. 从年前至今参加面试了很多公司,也收到了几家巨头的off ...

  4. Android屏幕适配的两种方式

    ScreenHelper github 地址:github.com/bugyun/Scre- 欢迎 star 和 提问. 第一种适配方式 - sw 方式 插件版本: 使用方法 在项目的根 build. ...

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

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

  6. Android不同屏幕适配的大神解决方案(转)

    在CSDN社区逛了这么多年,从中也学习了很多,但是一直没有时间自己写博客(其实是因为太菜,滑稽),这也是我第一次转载大神的文章,不是很会弄,所以里面的内容和链接全是用的原作者的,也没有经过精简和编辑, ...

  7. 今日头条的布局和字体适配方式

    本文:https://www.jianshu.com/p/f1a61baf66a6 原文:一种极低成本的Android屏幕适配方式 - 字节跳动技术团队 文章目录 前言 原文最终方案 如何确保每个Ac ...

  8. Android高手笔记-屏幕适配 UI优化

    Android高手笔记-屏幕适配 & UI优化 屏幕与适配 由于Android碎片化严重,屏幕分辨率千奇百怪,而想要在各种分辨率的设备上显示基本一致的效果,适配成本越来越高: 屏幕适配究其根本 ...

  9. 今日头条适配方案_煮酒论英雄之屏幕适配

    作者:JessYan 地址:https://www.jianshu.com/p/55e0fca23b4f1 前言 这个月在 Android 技术圈中 屏幕适配 这个词曝光率挺高的,为什么这么说呢?因为 ...

最新文章

  1. lstm中文分词pytorch版本
  2. 算法的复杂度与Master定理
  3. linux 下部署Python项目
  4. mybatis中使用mysql的模糊查询字符串拼接(like)
  5. mysql truncate partition_实战mysql分区(PARTITION)
  6. php如何上传文件,PHP上传文件
  7. 基于visual Studio2013解决C语言竞赛题之1026判断排序
  8. 通过XMPP协议实现推送信息
  9. Hive(一)——基础操作
  10. OpenCV之滑动条的创建和使用
  11. 传输控制协议端口服务多路开关选择器
  12. 数据库:关于BULK INSERT 学习笔记(1)
  13. 高数篇:06零点问题与微分不等式
  14. 那些小众却深得网友喜爱的导航网站
  15. 目标跟踪-按专题分类文章
  16. LeetCode-Hot100-两数之和
  17. SDEdit一点成画,小白也能是绘画大师!
  18. 【mmdetection3d】——3D 目标检测 NuScenes 数据集
  19. 从大数据看技术,为什么天猫双11是史上最大数字经济节日
  20. Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(1) C语言经典笔面试题(上)

热门文章

  1. 【Web安全】中国蚁剑+DVWA(本地文件上传漏洞Upload)
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY10-降维和度量学习
  3. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY6-支持向量机
  4. python——文件和数据格式化
  5. mysql 程序迁移_如何从MySQL数据库程序中迁移数据库文件
  6. emmc linux.格式化参数,SD卡, EMMC固化 ,关于bootloader linux
  7. apache配置支持mysql_Apache Kylin | 建立 JDBC 数据源
  8. oracle中database,Oracle Database 一些基本的视图和表
  9. python写入文件后换行_python向文件写入行避免fi末尾的换行
  10. stm32 micropython vscode_在vscode里基于Pymakr插件进行esp32的micropython开发