前言

Android 的屏幕适配是指适配不同机顶盒 UI 框架层输出的分辨率和 dpi,而不是适配不同分辨率的电视机(电视机的适配交由机顶盒本身完成,和各个应用无关)

之前的文章有介绍过适配相关的问题在和dimens插件,可以前往了解:

Android完美适配dimens.xml脚本

打造AS酷炫dimens适配插件

背景知识

1、什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?

  • 屏幕尺寸是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米;
  • 屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720;
  • 屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关;

像素密度公式:

例如:

600*1024的8寸屏幕 720*1280的8寸屏幕

2、什么是dp、dip、dpi、sp、px?之间的关系是什么?

  • dip:Density Independent Pixels(密度无关像素)的缩写。以160dpi为基准,1dp=1px
  • dp:同dip
  • dpi:屏幕像素密度的单位,“dot per inch”的缩写
  • px:像素,物理上的绝对单位
  • sp:Scale-Independent Pixels的缩写,可以根据文字大小首选项自动进行缩放。Google推荐我们使用12sp以上的大小,通常可以使用12sp,14sp,18sp,22sp,最好不要使用奇数和小数。

如图:

3、什么是mdpi、hdpi、xdpi、xxdpi、xxxdpi?如何计算和区分?

在Google官方开发文档中,说明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。

适配前准备工作

1、获取设备分辨率和dpi

可以通过以下代码获取机顶盒UI框架层实际输出的分辨率 (width * height),以及输出的像素密度和像素密度比值

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);//display = getWindowManager().getDefaultDisplay();display.getMetrics(dm)(把屏幕尺寸信息赋值给DisplayMetrics dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
// 屏幕密度(1.0 / 1.5 / 2.0)
float density = dm.density;
// 屏幕密度DPI(160 / 240 / 320)
int densityDpi = dm.densityDpi;
Logger.e("当前设备的分辨率宽=(" + width + "*  高度=" + height + ")  densityDpi =" + densityDpi + "  density=" + density);

输出:

当前设备的分辨 (率宽=1920*高度=1080)  densityDpi =160  density=1.0

2、与UI沟通如何出图?

  • 切图应该放哪个 drawable 文件夹下,切多大?
  • UI 应该以什么标准出图?
  • UI 出的标注图 px 和 dp之间如何转换?

举个例子:
某款盒子通过上述代码获得分辨率为19201080 ,DPI为160dpi,盒子连接的是4K的电视分辨率为38402160:

  • 通过160dpi,根据上表可以得知图片放在drawable-mdpi文件夹下
  • 在只考虑当前设备的情况下,UI应该以盒子的像素19201080出图因为,app 在机顶盒上实际输出的像素就只有19201080像素,而在4K电视上4K显示效果是机顶盒将系统UI框架的 1920*1080 像素的输出优化放大道 3840 * 2160 像素
  • 在160dpi情况下,px与dp是1倍的关系,所以1px = 1dp

适配规则

了解了基本知识和出图标准接下来我们来看一下如何适配:

如果此时我们又有一台设备分辨率为19201080 ,DPI为213dpi,盒子连接的是4K的电视分辨率为38402160:

我们可以计算一下倍数关系 213/160 = 1.33 ,我们发现并不是上面表格中提供的参数,是个非常奇葩的数字,此时我们计算一下宽度的dp值:1080/1.33=812,所以我们图片和资源文件可以放在values-sw812dpdrawable-sw812dp下面。
此时dimens文件中的数值也需要转换,两个相差1.33倍,那么 {***现在的dimens数值=(原来的dimens数值 /1.33)***}
建议使用打造AS酷炫dimens适配插件 本人的插件,方便做dimens适配哦。

这里只是教大家了一种机型的适配,实际开发中可能会遇到更多奇葩的机型,大家也可以直接使用values-1920x1080或者values-1920x1080-mdpi或者values-sw812dp-mdpi这种组合也可以,道理都是一样的。

详细过程可以参考官方教程屏幕兼容性概览

屏幕配置 限定符值 说明
smallestWidth sw<N>dp

示例:
sw600dp
sw720dp

屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。 具体来说,设备的 smallestWidth 是屏幕可用高度和宽度的最小尺寸(您也可以将其视为屏幕的“最小可能宽度”)。无论屏幕的当前方向如何,您均可使用此限定符确保应用 UI 的可用宽度至少为 <N>dp。

例如,如果布局要求屏幕区域的最小尺寸始终至少为 600 dp,则可使用此限定符创建布局资源 res/layout-sw600dp/。仅当可用屏幕的最小尺寸至少为 600dp 时,系统才会使用这些资源,而不考虑 600dp 所代表的边是用户所认为的高度还是宽度。smallestWidth 是设备的固定屏幕尺寸特性;设备的 smallestWidth 不会随屏幕方向的变化而改变

设备的 smallestWidth 将屏幕装饰元素和系统 UI 考虑在内。例如,如果设备的屏幕上有一些永久性 UI 元素占据沿 smallestWidth 轴的空间,则系统会声明 smallestWidth 小于实际屏幕尺寸,因为这些屏幕像素不适用于您的 UI。

这可替代通用化的屏幕尺寸限定符(小、正常、大、超大), 可让您为 UI 可用的有效尺寸定义不连续的数值。 使用 smallestWidth 定义一般屏幕尺寸很有用,因为宽度 通常是设计布局时的驱动因素。UI 经常会垂直滚动,但 对其水平需要的最小空间具有非常硬性的限制。可用的宽度也是 确定是否对手机使用单窗格布局或是对平板电脑使用多窗格布局 的关键因素。因此,您可能最关注每部 设备上的最小可能宽度。

可用屏幕宽度 w<N>dp

示例:
w720dp
w1024dp

指定资源应该使用的最小可用宽度(dp 单位) — 由 <N> 值定义。当屏幕的方向在横屏与竖屏之间切换时,系统对应的 宽度值将会变化,以 反映 UI 可用的当前实际宽度。

这对于确定是否使用多窗格布局往往很有用,因为即使是在 平板电脑设备上,您也通常不希望竖屏像横屏一样 使用多窗格布局。因此,您可以使用此功能指定布局需要的最小宽度,而 无需同时使用屏幕尺寸和方向限定符。

可用屏幕高度 h<N>dp

示例:
h720dp
h1024dp
等等

指定资源应该使用的最小屏幕高度(dp 单位) — 由 <N> 值定义。当屏幕的方向在横屏与竖屏之间切换时,系统 对应的高度值将会变化,以 反映 UI 可用的当前实际高度。

使用此方式定义 布局需要的高度很有用,它与使用 w<N>dp 定义 所需宽度的方式相同,无需同时使用屏幕尺寸和方向限定符。 但大多数应用不需要此限定符,考虑到 UI 经常垂直滚动, 因此高度更弹性,而宽度更刚性。

~~号外~~福利~~号外~~
程序员的福音: “老曾筋骨祛痛贴”,百年祖传配方,专治腰间盘肩周颈椎坐骨神经腰腿疼痛等,博主亲测效果非常棒,因长期久坐写代码,坐姿不规范导致脖子疼,腰椎疼,用过之后疼痛逐渐缓解,现在已无任何疼痛,用过后让你写代码一身轻松,so easy,妈妈再也不用担心我们写代码了。
购买链接: https://k.weidian.com/tja7GYzB

扫码下方二维码,关注公众号“伟大程序猿的诞生“,回复“膏药”领取优惠券
扫码关注公众号“伟大程序猿的诞生“,更多干货新鲜文章等着你~

公众号回复“资料获取”,获取更多干货哦~
公众号回复“膏药”,领取优惠券哦~

有问题添加本人微信号“fenghuokeji996” 或扫描博客导航栏本人二维码

Android TV开发总结【适配】相关推荐

  1. 【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

    Android TV 开发系列文章目录 [Android TV 开发]安卓电视调试 ( 开启网络远程调试 ) [Android TV 开发]焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设 ...

  2. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...

  3. android tv 菜单键,Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    前言:关于<TV Metro界面(仿泰捷视频TV版)源码解析>由于都是相关代码,就不发公众号了,有兴趣的可以看链接:http://blog.csdn.net/hejjunlin/artic ...

  4. android tv 云播放器,Android TV开发总结(六)构建一个TV app的直播节目实例

    近年来,Android TV的迅速发展,传统的有线电视受到较大的冲击,在TV上用户同样也可以看到各个有线电视的直播频道,相对于手机,这种直播节目,体验效果更佳,尤其是一样赛事节目,大屏幕看得才够痛快, ...

  5. android 仿 tv 菜单,Android TV 开发之仿泰捷视频最新 TV 版 Metro UI 效果

    Some Android TV related Sample 更多TV相关,欢迎关注公众号: Android TV开发交流群:135622564 1.Imitation of tai jie late ...

  6. android 按键分析,Android TV开发按键与焦点深入分析(四)

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前面三篇都是从源码的角度分析按键事件.焦点变换的原理,作为应用层的开发者, 分析源码都是带着实际的开发困惑的,要不然谁没 ...

  7. Android TV开发:APP安装、ICON图标问题

    使用AndroidX版本的Android Studio开发的面向TV的APK,安装后,在电视默认主屏没有显示该APP的ICON,是怎么回事? 一开始没有注意到电视的Android版本,安装APK时出现 ...

  8. 聊聊真实的 Android TV 开发技术栈

    智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了.但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两者并不一样. 一.序 ...

  9. Android TV 开发有关PopupWindow的KeyListener(手机也能用)

    转载请标明原地址:Android TV 开发有关PopupWindow的KeyListener(手机也能用)_高磊的专栏-CSDN博客 现在这个公司主要是做智能电视视频方面.有硬件电视盒子,APP开发 ...

  10. Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义

    1.常用的adb命令 2.ui适配方案 3.Leanback库简介 4.焦点处理 5.Listview GridView和recycler和自定义Recycler view动态添加view 6.按键失 ...

最新文章

  1. 深度学习中的优化算法之MBGD
  2. Https 公钥、私钥、证书
  3. 拼团小程序源码_纯小白如何做一个摄影电商拼团小程序?
  4. Apache在windows下的安装配置
  5. scala基础语法:for/while/do...while/
  6. xgboost论文公式解析
  7. 【语义分割】深度学习中常见概念回顾(全大白话解释,一读就能懂!)
  8. 西班牙人:武磊身体无恙 可以出场比赛
  9. 软件工程实验报告1-可行性分析
  10. 已解决IndentationError: unindent does not match any oute r indentation Level
  11. 计算机组成--虚拟存储器
  12. 数据压缩实验 LZW编解码算法的实现与分析
  13. 用于图像分割的卷积神经网络:从R-CNN到Mask R-CNN
  14. 双软企业的税收优惠政策怎么样?
  15. 鸿蒙系统大文件夹怎么调整大小,win7系统打开窗口太大或太小的调整方法
  16. 极致鸿蒙2.0——华为MatePad系列安装AidLux,一个自带vscode的Python编译环境
  17. 微信小程序模拟车牌号键盘
  18. Github的开源项目ChuanhuChatGPT和gpt-academic,专用于学术拓展ChatGPT
  19. Python 中的 zip()函数
  20. 【互粉社区】互粉社区为大家提供优质【求粉】和【评论】模板啦!

热门文章

  1. Go语言:交换两个整型变量的值
  2. php win 输入密码,win10开机密码输入框不见了怎么办
  3. java服务端验证框架_SpringBoot服务端数据校验过程详解
  4. Java基础学习(1)-反射
  5. 如何快速删除代码中的空行?eclipse删除空行超实用
  6. karto探秘之open_karto 第二章 --- 参数解析
  7. 机器学习and深度学习学习资料
  8. 全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解
  9. 一位算法工程师从30+场秋招面试中总结出的超强面经——目标检测篇(含答案)...
  10. iOS 中 UIView 和 CALayer 的关系