Android TV开发总结(五)TV上屏幕适配总结

前言:前面几篇总结一些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干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注

    时间: 2024-08-26 15:36:42

    Android TV开发总结(五)TV上屏幕适配总结的相关文章

    Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

    Android项目开发第五周

    本周进展:本周是此次Android项目开发最后一周,按照进度基本上完成了Android游戏开发的各项任务. 总的开发报告如下: 1.需求分析: 当前移动互联网快速发展,人们生活逐渐趋于多元化,以智能手机为代表的电子产品逐渐受到人们的追捧,手机游戏渐渐地成为了人们休闲娱乐的一种方式.本款软件是一款基于Android系统下采用2.5D技术开发的休闲益智类塔防游戏.塔防游戏是目前市场上比较流行的一类游戏. 2.系统设计: 本游戏的策划主要包含:游戏类型定位.呈现技术以及目标平台的确定等工作. 游戏类型

    【Android应用开发技术:用户界面】设备适配

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 由于Android平台的丰富性和多样性,全世界的Android设备有着各种各样的尺寸和大小,而为了能够推广我们的应用给各种各样的用户,设备适配是一件很重要的工作. 一 语言适配 把UI中的字符串存储在外部文件,通过代码提取,这是一种很好的做法.Android可以通过工程中的资源

    Android驱动开发第五章

    搭建S3C6410开发板的测试环境 开发板是开发和学习嵌入式技术的主要硬件设备, 尽管可以在 PC 上开发 Linux 驱动, 然后重 新编译成 ARM 架构的 Linux 驱动模块.但最终都是要在开发板上进行测试的. 本书主要介绍了S3C6410开发板及OK6410开发板.OK6410开发板是基于ARM11处理器的S3C6410,采用“核心版+底板”结构. OK6410开发板自带一个串口,PC也需要与串口设备通信.Ubuntu Linux安装串口调试工具minicom步骤: 第1步:检测当前系

    Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部分的实际开发知识,基本上掌握这些就可以做一个基本的NDK开发了,但是光是了解Java回调C层的数据是不是还不够啊,考虑问题要考虑可逆性,Java能回调C,那么C能否反过来回调Java呢?答案是肯定可以的,这篇博客就介绍一个C语言如何调用Java层的代码.以下是一些问题场景,我们带着这个问题场景来分析

    android studio开发笔记五

    1.activity:一个应用程序组件,提供用户与程序交互的界面2.android四大组件:--activity --service --BroadcastReceiver --Content Provider3.如何创建使用activity(1)继承android的acivity的类(2)重写方法(3)设置显示布局(4)在androidmanifest文件中,注册activity4.activity的生命周期:创建--->销毁onCreate()创建 onStart()运行 onResume(

    android驱动开发第五章心得笔记

    主要讲解的内容是是搭建开发板S3C6410的测试环境. S3C64103C6410是一个16/32位RISC微处理器,旨在提供一个具有成本效益.功耗低,性能高的应用处理器解决方案,像移动电话和一般的应用.它为2.5G 和 3G通信服务提供优化的H /W性能, S3C6410采用了64/32位内部总线架构. 同时还学习到了串口调试工具,minicom. 第一步: ls | greb usbserial 检测当前系统是否支持USB转串口 第二步: apt—get install minicom 安装

    Android 字体颜色在一些机型上不适配(textcolor失效)

    最近在参加一个创业项目的开发,其中在适配Android4.4版本时候遇到一个问题,本身title是白色字体,并且标签栏里面的字是绿色的,但是到了4.4手机上就变成了黑色. 也就是说textcolor并没有起作用,textview采用了默认的颜色. 最后查到了原因,原来是support-design包版本太高的缘故,导致还没有兼容4.4 将 更改为低版本的即可

    【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.com/han1202012/WheelViewDemo.git -- CSDN : http://download.csdn.net/detail/han1202012/8208997 ; 博客总结 : 博文内容 : 本文完整地分析了 WheelView 所有的源码, 包括其适配器类型, 两种回调接