Android TV开发总结【适配】
前言
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-sw812dp
和drawable-sw812dp
下面。
此时dimens文件中的数值也需要转换,两个相差1.33倍,那么 {***现在的dimens数值=(原来的dimens数值 /1.33)***}
建议使用打造AS酷炫dimens适配插件 本人的插件,方便做dimens适配哦。
这里只是教大家了一种机型的适配,实际开发中可能会遇到更多奇葩的机型,大家也可以直接使用values-1920x1080
或者values-1920x1080-mdpi
或者values-sw812dp-mdpi
这种组合也可以,道理都是一样的。
详细过程可以参考官方教程屏幕兼容性概览
屏幕配置 | 限定符值 | 说明 |
---|---|---|
smallestWidth |
sw<N>dp
示例: |
屏幕的基本尺寸,由可用屏幕区域的最小尺寸指定。 具体来说,设备的 smallestWidth 是屏幕可用高度和宽度的最小尺寸(您也可以将其视为屏幕的“最小可能宽度”)。无论屏幕的当前方向如何,您均可使用此限定符确保应用 UI 的可用宽度至少为 例如,如果布局要求屏幕区域的最小尺寸始终至少为 600 dp,则可使用此限定符创建布局资源 设备的 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开发总结【适配】相关推荐
- 【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )
Android TV 开发系列文章目录 [Android TV 开发]安卓电视调试 ( 开启网络远程调试 ) [Android TV 开发]焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设 ...
- Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑
原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...
- android tv 菜单键,Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑
前言:关于<TV Metro界面(仿泰捷视频TV版)源码解析>由于都是相关代码,就不发公众号了,有兴趣的可以看链接:http://blog.csdn.net/hejjunlin/artic ...
- android tv 云播放器,Android TV开发总结(六)构建一个TV app的直播节目实例
近年来,Android TV的迅速发展,传统的有线电视受到较大的冲击,在TV上用户同样也可以看到各个有线电视的直播频道,相对于手机,这种直播节目,体验效果更佳,尤其是一样赛事节目,大屏幕看得才够痛快, ...
- android 仿 tv 菜单,Android TV 开发之仿泰捷视频最新 TV 版 Metro UI 效果
Some Android TV related Sample 更多TV相关,欢迎关注公众号: Android TV开发交流群:135622564 1.Imitation of tai jie late ...
- android 按键分析,Android TV开发按键与焦点深入分析(四)
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 前面三篇都是从源码的角度分析按键事件.焦点变换的原理,作为应用层的开发者, 分析源码都是带着实际的开发困惑的,要不然谁没 ...
- Android TV开发:APP安装、ICON图标问题
使用AndroidX版本的Android Studio开发的面向TV的APK,安装后,在电视默认主屏没有显示该APP的ICON,是怎么回事? 一开始没有注意到电视的Android版本,安装APK时出现 ...
- 聊聊真实的 Android TV 开发技术栈
智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了.但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两者并不一样. 一.序 ...
- Android TV 开发有关PopupWindow的KeyListener(手机也能用)
转载请标明原地址:Android TV 开发有关PopupWindow的KeyListener(手机也能用)_高磊的专栏-CSDN博客 现在这个公司主要是做智能电视视频方面.有硬件电视盒子,APP开发 ...
- Android TV开发 TCL电视开发实战 ui适配和焦点控制 Recyclerview自定义
1.常用的adb命令 2.ui适配方案 3.Leanback库简介 4.焦点处理 5.Listview GridView和recycler和自定义Recycler view动态添加view 6.按键失 ...
最新文章
- 深度学习中的优化算法之MBGD
- Https 公钥、私钥、证书
- 拼团小程序源码_纯小白如何做一个摄影电商拼团小程序?
- Apache在windows下的安装配置
- scala基础语法:for/while/do...while/
- xgboost论文公式解析
- 【语义分割】深度学习中常见概念回顾(全大白话解释,一读就能懂!)
- 西班牙人:武磊身体无恙 可以出场比赛
- 软件工程实验报告1-可行性分析
- 已解决IndentationError: unindent does not match any oute r indentation Level
- 计算机组成--虚拟存储器
- 数据压缩实验 LZW编解码算法的实现与分析
- 用于图像分割的卷积神经网络:从R-CNN到Mask R-CNN
- 双软企业的税收优惠政策怎么样?
- 鸿蒙系统大文件夹怎么调整大小,win7系统打开窗口太大或太小的调整方法
- 极致鸿蒙2.0——华为MatePad系列安装AidLux,一个自带vscode的Python编译环境
- 微信小程序模拟车牌号键盘
- Github的开源项目ChuanhuChatGPT和gpt-academic,专用于学术拓展ChatGPT
- Python 中的 zip()函数
- 【互粉社区】互粉社区为大家提供优质【求粉】和【评论】模板啦!
热门文章
- Go语言:交换两个整型变量的值
- php win 输入密码,win10开机密码输入框不见了怎么办
- java服务端验证框架_SpringBoot服务端数据校验过程详解
- Java基础学习(1)-反射
- 如何快速删除代码中的空行?eclipse删除空行超实用
- karto探秘之open_karto 第二章 --- 参数解析
- 机器学习and深度学习学习资料
- 全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解
- 一位算法工程师从30+场秋招面试中总结出的超强面经——目标检测篇(含答案)...
- iOS 中 UIView 和 CALayer 的关系