纸上得来终觉浅 绝知此事要躬行。

安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念、dp转px。只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏幕适配方案。

需要适配的机型

从左到右依次是魅族,华为,小米手机。我们可以看到它们的物理尺寸不尽相同。

适配机型

各机型属性

我们写个小Demo测量出 状态栏高度,导航栏高度,屏幕宽度,屏幕高度,需要注意的是,这四个值单位都是像素。很多小伙伴都容易困惑与像素与厘米的区别,在测量结果中我们可以看到,三个手机都是宽1080px,高1920px(华为机计算应该是144+1776),但是三个手机的物理尺寸都是不相同的,所以我们可以得出结论:

px 和 cm 没有任何关系

各机型属性

我们同样还可以得出一个结论:

1080x1920指的是显示屏,不包括手机外壳

Values

Ok,我们现在来看一下values文件,这个是屏幕适配核心。

values

可以看到,我们分别为1080x1920和1776x1080创建了两个values文件,这样如果手机分辨率是1080x1920时,如果你的代码中有

R.dimen.xxx这样的代码系统会自动在1920x1080文件夹下的dimen文件中查找。同理,如果手机分辨率是1080x1776,系统会自动在1776x1080文件夹下的dimen文件中查找,这样我们创建多个values文件是不是就达到的屏幕适配?

values

我们可以看到,在values-1920x1080文件夹下的dimen文件中dp2px为540px,恰好是1080的一半,而在values-1776x1080文件夹下的dimen文件中则是1080,正好满屏。

效果图

看运行效果图我们能发现,在华为机(1080x1776)中是满屏,而在小米机(1080x1920)则是半屏,所以我们完全可以通过values文件来进行屏幕适配!

授人以渔

这里我借用 鸿洋 大神的一个类。

GenerateValueFiles

我们打开该java文件,并进行如下修改:

baseW and baseH

1080x1776

javac

我们会看到目录下多了res文件夹。

res

通常我们把这些values文件夹复制到我们项目中的res文件夹下就可以了。

values

分析

我们看看能不能真的进行屏幕适配。

假设现在UI给了你一张720x1280的图,我们那个java文件的baseW和baseH分别是1080,1920,所以我们需要将UI妹子给的标注图的px进行转换(实际运用中可以把baseW和baseH改成标注图的分辨率)。

假设一个按钮的高为10px,但这是720x1280的图,所以我们要先转换成1080x1920的像素, 10x1920/1280 = 15px,所以我们直接使用@dimen/y15就可以,但是我们可还有个1080x1776的华为机需要适配呢!10px在华为机中的像素可是 10x1776/1280 = 13.875px,我们去查看values-1776x1080文件夹下dimen文件。

values-1776x1080

可以发现,@dimen/y15在1776x1080的手机中是13.87px,因此实现啦屏幕适配!

GenerateValueFiles.java下载地址 : 猛戳此处

补充

android曲面屏触摸事件,Android屏幕适配完美解决方案(曲面屏手机也是小Case)相关推荐

  1. Android 6种触摸事件,Android 的触摸事件详解及示例代码

    由于触摸(Touch)而触发的事件 Android的事件:onClick, onScroll,onFling等等,都是由许多个Touch组成的.其中Touch的第一个状态肯定是ACTION_DOWN, ...

  2. android 触摸事件 取消,如何禁用/重新启用Android中的触摸事件?

    快速,可能很简单,问题.我有一个视图,其背景是动画,在那段时间,我想禁止用户与视图交互.我的视图是一个FrameLayout,我用onTouchEvent()捕获触摸事件.我试过的解决方案:如何禁用/ ...

  3. android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...

    zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...

  4. Unity安卓手机屏幕自适应完美解决方案

    本人正在努力建设自己的公众号,大家可以关注公众号,公众号将免费提供大量教学Unity相关内容,除了从Unity入门到数据结构设计模式外,我还会免费分享我再游戏开发中使用的素材,书籍,插件,希望大家可以 ...

  5. android方向触摸事件,Android触摸事件如何传递?

    慕工程0101907 让我们看一个视觉示例.在此处输入图片说明发生触摸事件时,首先会向每个人通知该事件,从活动开始,一直到顶部的视图.然后,每个人都有机会处理该事件,从顶部的视图(触摸区域中Z顺序最高 ...

  6. android dispatchtouchevent 用法,android – 检测每个触摸事件,而不会覆盖dispatchTouchEvent()?...

    回答这可能对他人有帮助.答案将有助于需要拦截触摸事件的库. 如果你不想覆盖dispatchTouchEvent()(Imp,如果你是编程库)方法的活动,那么我们可以使用Window.Callback类 ...

  7. android方向触摸事件,Android触摸事件传递机制,这一篇就够了

    整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...

  8. android 触摸屏 滑动,android开发:触摸屏触摸事件MotionEvent演示实例

    触摸事件,可以包含多点触摸,也可以使用捏合手势缩放,并且放大图片; 多点触摸的实现: num =motionEvent.getPointerCount()//使用MotionEvent的此方法来获取当 ...

  9. Android ViewGroup拦截触摸事件详解

    前言 在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如ListView下拉刷新就是典型的触摸事件拦截的例子.触摸事件拦截就是在触摸事件被parent view拦截,而不会分发给其chil ...

最新文章

  1. 使用 SAX 解析器简化文档处理程序的编写
  2. 最喜欢随机森林?周志华团队 DF21 后,TensorFlow 开源决策森林库 TF-DF
  3. windows编辑好的python代码在linux的vim编辑,缩进问题
  4. 第一章 为什么使用单元测试
  5. Python全栈(第一部分)day2
  6. 【夯实Mysql基础】mysql explain执行计划详解
  7. 约束条件创建定义表(主码,外码的确定和防止空值等)
  8. 回文字符串—回文子串—中心扩散法
  9. free和top显示可用内存不一致
  10. 科普漫画 | 沙子如何变成芯片?
  11. 今天开始学C#.NET
  12. 于.net开发平台项目案例集锦
  13. angular html页面嵌套,使用AngularJS来实现HTML页面嵌套的方法
  14. 奇怪的315:大家都知道,为什么要等晚会曝光,管理部门呢
  15. Zener二极管(稳压二极管)型号对照表--1N52xx系列
  16. 高级火山图 突出显示自定义的基因volcanic volcano plot duqiang 差异基因火山图
  17. 网上找了c#仓库管理程序,编译的时候一直 报错
  18. 苹果视频剪辑计算机配置,视频剪辑后期神器-创作PC黑苹果系统安装与台式电脑配置推荐...
  19. 删库跑路?我劝你不要这样。
  20. 极客快讯第 5 期:袁隆平对抖音账号不知情,抖音回应;百度宣布组建智能汽车公司;北京滴滴和花小猪将于一周内完成司机疫苗接种;

热门文章

  1. 年收入过10亿美元,Veeam看好云数据管理
  2. [分形学] 谢宾斯基 (Sierpinski) 三角形,也叫垫片
  3. Luminar 4:AI 天空更换
  4. java面试一紧张头脑就空了_我在面试、答辩时非常紧张,大脑一片空白,说话时声音发抖,心跳加快,完全放松不下来,不受控制,怎么办?...
  5. 独家专访 | 获得软银巨额投资的 Mapbox,要如何为自动驾驶提供地图服务?
  6. 现代控制—状态反馈极点配置函数(计算反馈增益k)
  7. 第5章第28节:演讲者放映、观众自行浏览和在展台浏览 [PowerPoint精美幻灯片实战教程]
  8. 超详细基于Qt平台实现C/C++调用Matlab函数全流程
  9. UE4插件BlueMan_VehicleAI使用
  10. 创新、变革以及你的有生之年