Android——DisplayMetrics之我见

写这篇文章主要是因为这个问题困扰我很久,今天终于搞明白了,分享出来供以后查阅。

一、起因

为了适应多屏幕分辨率,可以在res目录下建立不同的layout文件,例如想适应C8500(320*240)和Milestone(854*480),可以在res目录下建立layout-320*240和layout-854*480两个目录,然后在其中定义不同的布局文件就可以了;但在实际中并没有凑效;这是为什么呢;

在真机下调试才发现有问题,Android有个类DisplayMetrics可以得到分辨率等信息,方法如下:

DisplayMetrics metrics;getWindowManager().getDefaultDisplay().getMetrics(metrics);

metrics.widthPixels           屏幕宽

metrics.heightPixels          屏幕高

metrics.density                  屏幕密度

其它用不到的属性就不写了,调试中发现C8500得到的是427*320,而而Milestone得到是569*320;这是为什么呢?难道是Android API有问题?

二、探索

实际上是自己对Android多屏幕分辨率理解不深刻,那么问题出在哪儿呢?这里需要用到一个公式pixels = dps * (density / 160),在SDK中有提到,需要说明一点公式中的density与metrics.density不是一个东西,它们的关系是:metrics.density = density / 160,density的值有120、160、240、320(这在SDK中也有说明);好了直接套用公式就OK了C8500实际分辨率为320*240,密度(也就是metrics.density的值)为0.75,用公式算出来正好是427*320;Milestone实际分辨率是854*480,密度是1.5,算出来是569*320(有四舍五入的);

好吧,按照以上的结论直接在res目录下建立layout-427*320和layout-569*320;分别编写不同的布局文件,OK!问题解决,终于可以适应两个手机屏幕了。

三、没有结束……

真的就这么搞定了吗?似乎没有,把AndroidManifest.xml中android:minSdkVersion=”3″(一直都是3),中3改为4,问题又来了,界面又乱了,在两个手机都乱了;怎么回事呢?再调试,我那个晕,C8500手机屏幕分辨率又变了,变回320*240,套用上面的公式反而又错了,程序又找不到布局文件了,界面自然就乱了,这是WHY   WHY   WHY????

别着急,再来看看问题出在哪儿。查找SDK,加上自己对Android多分辨率的支持的理解,真正的原因应该是当android:minSdkVersion=”3″时也就是此时支持android1.5,在 Android 1.5以及更早的版本中,只支持3.2″ 屏幕上的HVGA (320×480)分辨率,开发人员也不需要考虑界面的适配性问题。从Android 1.6之后,平台支持多种尺寸和分辨率的设备,这也就意味着开发人员在设计时要考虑到屏幕的多样性。

由此可见,在android:minSdkVersion=”3″时,还没有多分辨率的概念,因而此时,DisplayMetrics得到的宽和高是与密度相关的,也就是说此时得到的宽和高都是以dp或dip为单位的,要转换成px才是我们通常据说的分辨率。自android1.6及以后,DisplayMetrics得到的宽和高都是以px为单位的,不需要转换。

总结一下:android的兼容性意味着应用程序api的降级。api的降级意味着在高端机(版本高配置高)上的显示效果配不上。

转:http://cxxowl.sinaapp.com/?p=12

Android——DisplayMetrics之我见相关推荐

  1. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics

    我喜欢对应用程序中的所有位置使用百分比.我总是使用相同的系统.我是android编程的新手. 这是课程: public class SCREEN { DisplayMetrics dm = new D ...

  2. android DisplayMetrics

    Android可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题. 手机的分辨率信息是手机的一项重要信息,很好的是,Android已 ...

  3. Android DisplayMetrics 详解

    DisplayMetrics信息获取: //Display屏幕显示的详细信息 Display display = getWindowManager().getDefaultDisplay(); //从 ...

  4. 【Android】缩略图Thumbnails

    核心技术类目 全部主题HadoopAWS移动游戏JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript数据库 ...

  5. terraform_有关使用terraform优化云成本的权威指南

    terraform This article was cross-published on the HashiCorp Blog. 本文是在HashiCorp博客上交叉发布的. The Problem ...

  6. terraform 腾讯云_使用Terraform优化云成本的权威指南

    terraform 腾讯云 The Problem - An Engineers New Role Cloud "Financial Controller" 问题-工程师的新角色云 ...

  7. mfc获取别的计算机是否在线,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  8. mfc改计算机名称,VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  9. Android基础教程(四)之-----取得手机屏幕大小DisplayMetrics的应用

    2009-11-08 20:15:25 标签:Android 屏幕 手机 基础 教程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http: ...

最新文章

  1. 【操作系统】重点知识点总结
  2. java验证码(采用struts2实现)转
  3. 自动化运维之 安装部署 Ansible 服务
  4. Dataphin产品核心功能大图(六)发布中心:生产和开发隔离模式下的保护伞
  5. CDN/视频流成“风口”,2 年内实现规模商用,揭晓 2020 年边缘计算发展现状!...
  6. java ArrayList中的subList方法
  7. Java知多少(76)语言包(java.lang)简介
  8. 编写可靠Linux shell脚本的建议
  9. PAT 1012. 数字分类 (20)
  10. 信息熵与二进制--信息论系列
  11. macbook 打开多个终端
  12. 小程序切出去重新进入
  13. R语言方差分解分析(Variation partition analysis)及其显著性检验
  14. 前端杂烩——在工作,在思考,在沉淀
  15. 中南民族大学计算机组成原理实验,中南民族大学计算机组成原理试题及答案剖析...
  16. java声卡录音_win10下程序无法录音或使用麦克风
  17. Android 兼容Android 7拍摄照片/打开相册/选择照片/剪裁照片/显示照片 带demo
  18. linux 万能五笔安装
  19. 通过Requst进行12306查票(2022-09-10)
  20. hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建

热门文章

  1. 战神引擎各类修改地址中文注释汇总
  2. 苹果六现价多少钱_六克拉的Derier多少钱 六克拉钻戒多少钱
  3. 数据流图定义,特点,符号,绘制方法,数据流图的用途
  4. Deepin-TIM或Deepin-QQ调整界面DPI字体大小的方法
  5. 光滑曲线_消防水泵-流量扬程性能曲线
  6. linux脚本echo off,echo什么意思_@echo off的作用 - 编程语言及工具 - 电子发烧友网
  7. 奖励补贴有点多!武汉市大健康和生物技术产业发展奖励措施解读
  8. [Kaggle]泰坦尼克号沉没预测
  9. 创意h5案例作品展示:谁是王牌拆弹专家
  10. 大家都在努力,你凭什么不努力?