前言:前面几篇总结一些TV上的小Sample,开源到GitHub: https://github.com/hejunlin2013/TVSample, 点击链接,可以持续关注。今天总结下TV上屏幕适配.:
看下Agenda:
  • 一、屏幕适配的一些背景知识
  • 二、TV屏幕适配怎么适配?有哪些规则?
  • 三、多屏幕适配,android读取res/drawable优先级是什么?
  • 四、屏幕分辨率及density 、densityDpi代码

一、屏幕适配的一些背景知识

介绍几个在Android屏幕适配上非常重要的名词:

1

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

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

  • 屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720;

  • 屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关。

  • 例如:计算Nexus5的屏幕像素密度:
    屏幕尺寸:4.95inch、分辨率:1920×1080,屏幕像素密度:445

和官方给出的一样,说明我们计算正确。

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,最好不要使用奇数和小数。

说明:如果A设备的参数为480×320,160dpi,B设置的参数为800×480,240dpi。我们要画出一条和屏幕宽度一样长的直线,如果使用px作为单位,必须在A设备上设置为320px,在B设备上设置480px。但是如果我们使用dp作为单位,由于以160dpi为基准,1dp=1px,所以A设备上设置为320dp就等于屏幕宽度(320px),在B设备上设置为320dp就等于320×(240/160)=480px,即B设备的屏幕宽度。这样,使用dp作为单位就可以实现简单的屏幕适配。这知识一种巧合,也有B设备的像素密度不是这样刚刚好的,就需要我们运用别的屏幕适配技术。

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,以此类推。

二、TV屏幕适配怎么适配?有哪些规则?

先看下一些盒子的分辨率

屏幕密度值未列入其中,第二栏的说明最后的值,就是通过在不同分辨率下,屏幕密度值不同,得到的不同结果,可以看到同样是1280*720的盒子,由于屏幕密度值不同,对得到的dpi不同。

于是就有了这种适配,在此之前,无论是做Android TV开发,还是做phone端开发,永远不要迷信大家说的万能适配,对于图片之类的素材,根本没有所谓的捷径。所以要了解,当apk,运行在android系统中时,系统是如何读取各drawable的先后顺序的。以之前奇葩的小米2代为例,相比正常的盒子英菲克I9,同样1280*720,dpi一个是160,一个是213dpi,当图片放到hdpi下,发现在小米2代,图片永远显示不正常。

三、多屏幕适配,android读取res/drawable优先级是什么?

以下是我的总结(按读取优先级顺序排列):

  • 1.语言(zh-rCN)
  • 2.smallestWidth最短可用宽度(与屏幕方向无关)
  • 3.available width(w-<N>dp)(与屏幕方向有关)
  • 4.values/drawable-1920x1080
  • 5. drawable-213dpi
  • 6. ldpi/mdpi/hdpi/xhdpi/xxhdpi

说明:

  • 对于第一项:可以看到先从语言类开始读取,如果做国际化的,可以关注此项,第1项暂时不看。
  • 对于第二项:就是values-sw540dp,诸如此类,sw代表最短可用宽度,注意,是和屏幕方向无关,如一个分辨率为1280*720,sw就是720,假设它的density(屏幕密度)为2,通过公式720/2=360, 这个360就是densityDpi(屏幕密度DPI),所以,在适配时,用values-sw360dp,适配就行了。那问题来了,drawable要不要这样呢?对于文章开头那个表格,360dp是属于xxhdpi,所以把图放到对应有xxhdpi就能完成适配。
  • 对于第三项:诸如values-w540dp/values-h,这种是有和屏幕方向有关,第一个后缀w<N>dp 如layout-w600dp, values-w600dp带这样后缀的资源文件的资源文件制定了屏幕宽度的大于Ndp的情况下使用该资源文件,但它和sw<N>dp不同的是,当屏幕横向纵向切换时,屏幕的宽度是变化的,以变化后的宽度来与N相比,看是否使用此资源文件下的资源。第二个后缀h<N>dp 如layout-h600dp, values-h600dp这个后缀的使用方式和w<N>dp一样,随着屏幕横纵向的变化,屏幕高度也会变化,根据变化后的高度值来判断是否使用h<N>dp ,但这种方式很少使用,因为屏幕在纵向上通常能够滚动导致长度变化,不像宽度那样基本固定,因为这个方法灵活性不是很好,google官方文档建议尽量少使用这种方式。
  • 第四项,是指写死对应的分辨率,android碎片化严重的情况下,显然不可取
  • 第五项,这个就是为解决同一分辨率下,不同的density引起的适配问题。如上面的小米2代解决方案,最后就是加上这个资源目录,换了一个图(图片比原来小),问题解决。
  • 第六项,就是平时经常用到的,通常是这种方法不能解决适配的需要时,才配合前面的几种一起使用解决适配问题。

四、屏幕分辨率及density 、densityDpi代码

mText = (TextView) findViewById(R.id.text);

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int width = metric.widthPixels;  // 屏幕宽度(像素)

int height = metric.heightPixels;  // 屏幕高度(像素)

float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

String info = "手机型号: " + android.os.Build.MODEL + ",\nSDK版本:"

+ android.os.Build.VERSION.SDK + ",\n系统版本:"

+ android.os.Build.VERSION.RELEASE  + "\n屏幕宽度(像素): "                       +width + "\n屏幕高度(像素): " + height + "\n屏幕密度:  "                              +density+"\n屏幕密度DPI: "+densityDpi;

Log.d("system Enviriment", info);

mText.setText(info);

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注

Android TV开发总结(五)TV上屏幕适配总结相关推荐

  1. android应用前端,Android应用开发之浅谈移动前端适配

    本文将带你了解Android应用开发之浅谈移动前端适配,希望本文对大家学Android有所帮助 1. 什么是前端适配 从UI展现层面上: 我们期望不同尺寸的设备,页面可以自适应的展示或者进行等比缩放, ...

  2. 安卓TV开发(五) 移动智能终端UI之实现主流TV焦点可控UI

       载请标明出处: http://blog.csdn.net/sk719887916 ,作者: skay    由于其他网站收录,导致你无法查看本系列原创文章请点击此处 安卓TV开发(四)实现主 ...

  3. Android TV开发(二)处理TV硬件

    官网:https://developer.android.com/training/tv/start/hardware.html 电视硬件与其他Android设备明显不同.电视不包括一些其他Andro ...

  4. Android驱动开发第五章

    搭建S3C6410开发板的测试环境 开发板是开发和学习嵌入式技术的主要硬件设备, 尽管可以在 PC 上开发 Linux 驱动, 然后重 新编译成 ARM 架构的 Linux 驱动模块.但最终都是要在开 ...

  5. Android音频开发(五)如何存储和解析最简单的音频wav文件

    我们大家都知道,无论是文字.图像还是声音,都必须以一定的格式来组织和存储起来,然后其它的软件再以相同的协议规则,相应的格式才能去打开解析这一段数据,例如,对于原始的图像数据,我们常见的格式有 YUV. ...

  6. Android 蓝牙开发(五)OPP接收文件

    原址 1 创建rfcomm层sever 要想通过蓝牙接收文件,首先要打开蓝牙.所以先从打开蓝牙进行分析.  BluetoothOppReceiver在AndroidManifest.xml文件中进行了 ...

  7. Android 驱动开发系列五

    转至:http://blog.csdn.net/brantyou/article/details/8782396 这一篇将说到 如何为JNI接口(Frameworks层)添加对应的service访问服 ...

  8. Android UI开发第五篇——自定义列表

    自定义列表,设置列表背景.列表的列背景.列表的间隔线. 借鉴了一些前辈的代码. MainActivity.class public class MainActivity extends Activit ...

  9. Android 日历开发教程[五]

    农历计算类 农历计算的算法,来源于:http://sean.o4u.com/ap/calendar/,具体的代码基本与来源处的 javascript 相同,差不多只是语言上的转换而已. 将这个类命名为 ...

  10. 【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记! .

    http://blog.csdn.net/xiaominghimi/article/details/6127578 http://www.androidegg.com/portal.php?mod=v ...

最新文章

  1. 2022版全球及中国应急装备市场格局分析与投资策略建议报告
  2. 粤桂粤黔协作签约-丰收节交易会·李喜贵:谋定一县一园产业园
  3. 浅谈移动类型102、122和161区别
  4. 联发科技嵌入式_英特尔联手联发科技重回移动5G征途,能否与高通抗衡?
  5. 命令行编译java项目_命令行编译运行java工程(转)
  6. C语言程序设计与有限元,C语言与有限元程序设计.pdf
  7. Java折叠_[Java教程]Jquery中菜单的展开和折叠
  8. java web事务控制_JavaWeb学习之事务
  9. obs点开始推流显示无法连接服务器,前沿科技资讯:OBS Studio推流连接失败如何办 OBS推流失败的正确解决方法...
  10. 解析:浏览器事件冒泡及事件捕获
  11. python爬去新浪微博_python 爬取新浪微博信息
  12. Kerberos原理
  13. 9月25日科技资讯|小米推出售价 19999 元的 MIX Alpha;高通已向华为重启供货;.NET Core 3.0 发布
  14. 地理信息系统专业考研 GIS专业考研 名词解释大全[转]
  15. NVME-MI 学习记录_1 框架
  16. CH559L单片机ADC介绍以及ADC采样案例
  17. 在CMD命令行中切换到管理员权限模式
  18. 手势操作各个方法的含义
  19. jnz和djnz_djnz指令的应用方法
  20. 最易懂的RAID0、RAID1、RAID5、RAID10/01概念解析

热门文章

  1. java后端开发简历模板,最全Java知识总结
  2. mysql8.0升级_MySql版本升级(8.0.19升级到8.0.22)
  3. CTF_BUGKU_WEB_game1
  4. C语言进制转换 10进制转16进制(一)
  5. TurboC 2.0下载及使用方法
  6. 滤波器基础06——滤波器设计软件
  7. C语言程序设计的特点
  8. c语言程序设计身高体重测评系统,C语言程序设计验.doc
  9. JavaScript高级程序设计学习总结一
  10. 袖珍计算器c语言设计源码,VB程序题:编一模拟袖珍计算器的完整程序,界面如下图所示。要求:输入两个操作数和一个操作符,根据操作符决定所做的运算。 VB源码 龚沛曾...