当前位置:网站首页>21天学习挑战赛--第一天打卡(屏幕密度)
21天学习挑战赛--第一天打卡(屏幕密度)
2022-08-02 10:25:00 【孟芳芳】
1.回想
从事安卓开发几年,现在回想一下,从刚入行时会展示几个简单的控件就开心不已,到后来接触Android的四大组件,再到自定义View,最后到使用第三方开源框架做几个自认为酷炫的功能……然后好像就止步不前了,中间好几年都是凭借着这点初级的东西在“浪费生命”……
直到前两年意识到不能再这样下去,如果对于日新月异的技术只是知其然,而不知其所以然,那很快就会被淘汰,于是开始研究源码。一研究源码,发现自己好像又啥也不会了,又处于了刚入行的迷茫中……
趁着21天学习挑战的机会,逼自己一把,跟着大神狠狠学21天!
打卡第一天:像素密度、屏幕密度、分辨率。
2.背景:
为了适配不同屏幕大小,Android开发过程中,需要在资源文件中添加ldpi、mdpi、nodpi、xhdpi、xxhdpi、xxxhdpi多张图片。
3.几个概念
①屏幕大小
屏幕大小指的是手机对角线的物理尺寸,以英寸(inch)为单位,一英寸大约2.54厘米。
一般手机尺寸有4英寸、4.5英寸、5.0英寸、5.2英寸、5.4英寸、5.99英寸、6.0英寸、6.2英寸等。
②屏幕分辨率
分辨率是手机屏幕的像素点总数,一般用屏幕宽的像素点数乘以屏幕高的像素点数。分辨率越大屏幕越细腻,能够显示的细节就越多。
常用的分辨率有320x240、640x480、1280x720、1280x960、1080x1920、2560x1440等,单位是像素。比如1080x1920表示屏幕宽度方向上有1080个像素,屏幕高方向上有1920个像素。
获取屏幕分辨率:
int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽
int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高
③像素密度
像素密度(dpi,dots per inch;或PPI,pixels per inch)指每英寸上的像素点数。
④屏幕密度:
屏幕密度其实是像素密度的另外一种表示,是以160dpi=1.0为基准的。手机出厂之后屏幕密度,包括X,Y轴方向的像素密度都是固定值。
android以像素密度160dpi为基准对屏幕进行划分,当像素密度为160dpi时屏幕密度为1.0,像素密度为120dpi时屏幕密度为0.75,像素密度为320dpi时屏幕密度为2.0。
android将实际的屏幕密度划分为low、medium、high、and extra high、extra extra high。
一般情况下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi ,xxhdpi 是480dpi。
获取像素密度和屏幕密度:
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
float density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
int densityDPI = dm.densityDpi; // 像素密度(每寸像素:120/160/240/320)
float xdpi = dm.xdpi; //X轴方向的像素密度
float ydpi = dm.ydpi; //Y轴方向的像素密度
screenWidth = dm.widthPixels; // 屏幕宽
screenHeight = dm.heightPixels; // 屏幕高
4.多个drawable如何加载
android系统适配drawable时,会首先在与设备对应的dpi目录下查找。如果没有找,则会遵循“先高再低”原则,然后按比例缩放图片。
比如当前为xhdpi设备(项目中只有xxhdpi,xhdpi,xxhdpi,nodpi,mdpi,hdpi),则drawable的寻找顺序为:首先查找xhdpi目录,如果没找到就会查找xxhdpi,如果还没有找到就查找xxxhdpi,还没有找到就查找nodpi,如果还没有找到就查找hdpi,再找不到就查找mdpi,依次查找。如果在xxhdpi中找到目标图片,则压缩2/3来使用(因为系统认为它找到了一个比合适尺寸大的图片),如果在mdpi中找到图片,则放大2倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。
边栏推荐
- c#反射和特性
- MSYS2 QtCreator Clangd code analysis can not find mm_malloc.h problem remedy
- LayaBox---TypeScript---迭代器和生成器
- Verilog的随机数系统任务----$random
- 学习笔记-支付宝支付
- LayaBox---TypeScript---Namespaces and modules
- Oracle查询提示 ORA-00933 SQL command not properly ended 原因排查
- 【术语科普】关于集成工作台那些难懂的词儿,看这篇秒懂!
- 5G基础学习1、5G网络架构、网络接口及协议栈
- 循环结构--do-while循环
猜你喜欢
随机推荐
8年软件测试工程师的感悟:与薪资相匹配的永远是实力
新“内卷”席卷科技圈,Google CEO 要求 174000 员工提高工作效率!
MySQL百万数据优化总结 一
LayaBox---TypeScript---JSX
从测试入门到测试架构师,这10年,他是这样让自己成才的
一款优秀的中文识别库——ocr
Do you agree with this view?Most businesses are digitizing just to ease anxiety
如何安装dosbox(pycharm详细安装教程)
全新荣威RX5,27寸大屏吸引人,安全、舒适一个不落
yolov7 innovation point
The heavyweights are coming!Spoilers for the highlights of the Alibaba Cloud Life Science and Intelligent Computing Summit
FPGA手撕代码——CRC校验码的多种Verilog实现方式 (2021乐鑫科技数字IC提前批代码编程)
读博一年后对机器学习工程的思考
R语言ggpubr包的ggbarplot函数可视化分组柱状图、设置add参数为mean_se可视化不同水平均值的柱状图并为柱状图添加误差线(se标准误差)、position参数自定义分组柱状图分离
R语言时间序列数据算术运算:使用log函数将时间序列数据的数值对数化、使用diff函数计算对数化后的时间序列数据的逐次差分(计算价格的对数差分)
yolov7创新点
神通数据库,批量插入数据的时候失败
阿里云数据存储生态计划发布,助力伙伴数据创新
配置mysql失败了,这是怎么回事呢?
利用二维数据学习纹理三维网格生成(CVPR 2020)