当前位置:网站首页>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倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。
边栏推荐
- [Science of Terminology] For those difficult words about the integrated workbench, read this article to understand in seconds!
- 行为型模式-模板方法模式
- 字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
- Com多进程通信实现
- LayaBox---TypeScript---命名空间和模块
- Oracle超全SQL,细节狂魔
- 零代码工具推荐---HiFlow
- 享年94岁,图灵奖得主、计算复杂性理论先驱Juris Hartmanis逝世
- 神通数据库,批量插入数据的时候失败
- 超赞!发现一个APP逆向神器!
猜你喜欢

npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.

5G基础学习1、5G网络架构、网络接口及协议栈
开箱即用-使用异步加载布局来优化页面启动速度的几种方案

阿里云数据存储生态计划发布,助力伙伴数据创新

周杰伦新歌发布,爬取《Mojito》MV弹幕,看看粉丝们都说的些啥!

npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.

MySql tens of millions of paging optimization, fast insertion method of tens of millions of data

利用二维数据学习纹理三维网格生成(CVPR 2020)

Verilog的随机数系统任务----$random

FPGA手撕代码——CRC校验码的多种Verilog实现方式 (2021乐鑫科技数字IC提前批代码编程)
随机推荐
如何封装微信小程序的 wx.request() 请求
为什么要使用BGP?
WPF 截图控件之文字(七)「仿微信」
零代码工具推荐---HiFlow
全新荣威RX5,27寸大屏吸引人,安全、舒适一个不落
LayaBox---TypeScript---Advanced Type
关于#oracle#的问题,如何解决?
鸿星尔克再捐一个亿
bgp与mpls综合实验
软件测试的基本理论知识(软件测试面试基础知识)
R语言时间序列数据的平滑:使用KernSmooth包的dpill函数和locpoly函数对时间序列数据进行平滑以消除噪声
The R language uses the ggtexttable function of the ggpubr package to visualize the table data (draw the table directly or add the table data to the image), set the theme parameter to customize the fi
字节跳动软件测试岗,收到offer后我却拒绝了~给面试的人一些忠告....
DirectX修复工具增强版「建议收藏」
The 38-year-old daughter is not in love and has no stable job, the old mother is crying
基于列表的排队与叫号系统
开源一夏 | GO语言框架中如何快速集成日志模块
R语言ggpubr包的ggbarplot函数可视化分组柱状图、设置add参数为mean_se可视化不同水平均值的柱状图并为柱状图添加误差线(se标准误差)、position参数自定义分组柱状图分离
21年毕业转行软件测试,从0收入到月薪过万,我真的很幸运...
一款优秀的中文识别库——ocr