近来在做android屏幕适配这方面的工作, 今天总算有点眉目.  小记一下

基础知识就不科普了, 网上一大堆. 作为一个刚接触这方面人, 最先进入我脑子的, 是从小到大的各种屏, 小到手表, 大到街头上看到的广告牌. 然后对这些不同大小的屏按使用方式来区分一下:

3.5 英寸以下的. 这个尺寸以下的手机比较少, 穿戴设备比较多

3.5 - 7 英寸  这个尺寸区间主要是手机

6 英寸以下的平板. 也是比较少的

6 - 11 英寸 这个区间主要是平板

手机和平板都是拿在手上的设备(当然也可以放在支架上看), 以7英寸作为尺寸分割点. 这个分割点决定了界面的布局, 即, 小于7英寸的屏用一套布局, 大于7英寸的屏用另一套布局(因屏的大小或者横竖使用, 得用到两到四套布局)

由于项目目前只考虑在手机上使用, 所以目前就只要考虑7英寸以下的屏, 就是说, 只要写一套布局就行了.  后期要做平板的话, 再写另外的布局. 用到fragment.  这个有点离题了, 不扯这个.

layout_width & layout_height 只用match_parent.
用px显然是不行的. 同样大小的屏, 分辨率低的屏显示出来的控件大, 分辨率高的屏显示出来的控件小, 随着分辨率的差异越来越大, 控件显示出来的大小差异也越来越大. 
用wrap_content也是有问题的. 现在图片资源都放在drawable-x & mipmap-x 两个目录中.
  drawable放.9图片以及一些selector, corner 用来控制这些.9显示风格的.
  mipmap放图片资源.  后面的-x 是指 ldpi, mdpi, hdpi, xhdpi, xxhdpi. 每个目录下面放不同像素密度的图片资源. 如果把资源都放在某一个目录下面. 比如都放在xhdpi下面, 考虑同样大小的屏(手机屏的大小差异没多少), 那么在高分辨率屏的下面显示出来的图片就比较大, 而在低分辨率屏的下面显示出来的图片就比较小, 因为android系统将xhdpi下面的图片缩小了之后再拿到低分辨率屏下面使用, 所以变小了.  好了,  那么如果这些图片资源放在lhdpi下面呢  那么在低分辨率屏下面显示出来很清晰,  但是在高分辨率屏下面显示出来就很模糊了,  因为android系统将lhdpi下面的图片放大了之后再拿到高分辨率屏下面使用. 所以图片就变大, 也就变模糊了.

如果不想android系统放大或者缩小图片, 那就用高分辨率图片直接放在mipmap目录下面吧.

还是考虑差不多大小的手机屏, 不同的分辨率以及不同的长宽比. 其实对于长宽比固定的分辨率, 如果在布局文件中都是使用相对布局, 那么布局不会发生改变. 剩下的就是要考虑到长宽比不一样的分辨率了. 
比如说一些常见的分辨率. {640*360} {960*540} {1280*720} {1920*1080} {2560*1440} 这几个分辨率的长宽比都是1.7777.... 
{1280*768} {800*480}  这两个长宽比是1.666...{1280*800} {2560*1600} 这两个长宽比是1.6
对于这些乱七八糟的长宽比, 同样的布局显示出来的效果就会有拉伸的效果了. 因长宽比值大小而决定拉伸效果.

后来就想用dimens来写不同分辨率下面对应的px, 然后在布局中直接使用dimens, 这样在不同的机型上面会用到不同的数值. 从而适配不同长宽比的屏. 但是这样做有两个问题. 一是这样的dimens太多,难以维护,就算做了主流的分辨率, 遇到一个分辨率未设置dimens的手机,显示出来的效果就非常糟糕. 二是有些手机它下面的那一排控制按钮是用软件实现的, 不是直接做在硬件上面的. 这就对界面的分辨率生产了影响.
从3.0以后, 对于要适配1280*720这样分辨率的屏, 之前的写法是写一个layout-1280x720这样的文件夹, 里面放置对应的dimens文件. 而现在要减去一个48px(状态栏的高度), 文件夹的名称就要写成layout-1232*720, 然后里面放置dimens文件, 但是我测试了一些机器发现读取不到这个文件, 找了一下问题, 发现不同的系统状态栏的高度是不一样的, 如果还要使用这样的解决方案的话, 那得先解决状态栏不一样高这个问题. @_@!!!   其实可以在values/dimens.xml中来设置这个状态栏高度, 不过我测试.

其实问题的根源就是控件无法在长宽上面设置相对的百分比. 然后想到了扩展控件修改自绘, 添加相对百分比的属性. 这样一想, 就先到网上找找有没有人 有过同样的想法并实现了的, 还真有! 参考下面的链接:
http://blog.csdn.net/lmj623565791/article/details/46767825

下面就是使用这个库了. 在使用的问题遇到一个问题:
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 2

这个问题是由于库冲突. 那只要把冲突的库排除了就可以了.

先在gradle.build中把这个库给注释掉
编译运行一下, 没有问题. 打开ProjName/.idea/libraries, 把这个目录下面的文件截个图保存一下(用来对比看看多了哪个库).  然后把gradle.build中的引用库注释取消. 再编译, 出现上面的问题, 再打开ProjName/.idea/libraries 看看这时候目录下面跟刚才相比多了几个文件, 如下图, 多了三个文件:

第一个文件是库的引用, 在gradle.build中把下面的两个文件删除即可, 如下图

再运行, OK, 没问题了.

转载于:https://www.cnblogs.com/emyueguang/p/5070784.html

android 手机 多分辨率适配相关推荐

  1. 老李分享:android手机测试之适配(1)

    老李分享:android手机测试之适配(1) Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念 ...

  2. Android开发——Android手机屏幕适配方案总结

    0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博 ...

  3. android手机分辨率适配,Android屏幕适配(一)

    为什么要屏幕适配 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,于是导致运行 Android 的设备多种多样,它们有着不同的屏幕尺寸和像素密度. ...

  4. Android手机屏幕适配

    Android机型尺寸各种各样,于是屏幕适配就成了Android开发中很重要的一环.Android屏幕适配可能一些开发者都会遇到这样的问题,今天就来分享下屏幕适配,其实Android屏幕适配也可以很简 ...

  5. android手机屏幕适配理论知识

    对于具有相同像素密度的设备来说,像素越高,尺寸就越大,所以可以换个思路,讲问题从单纯的尺寸大小转换到像素大小和像素密度的角度来 占比最高的是480*800,320*480的设备竟然也占据了很大比例,但 ...

  6. mdpi的手机_【初印象】Android手机屏幕适配API:nodpi,xhdpi,hdpi,mdpi,ldpi

    Android的碎片化设备状况,使得其API必须在不同的屏幕中选取合适的算法并展示,而在API级别上,的确也是有类似的定义,当然,我也终于明白,这是Android的显示效果始终跟不上苹果的原因 苹果的 ...

  7. 【初印象】Android手机屏幕适配API:nodpi,xhdpi,hdpi,mdpi,ldpi

    为什么80%的码农都做不了架构师?>>>    Android的碎片化设备状况,使得其API必须在不同的屏幕中选取合适的算法并展示,而在API级别上,的确也是有类似的定义,当然,我也 ...

  8. Android:多分辨率适配

    一.图片适配: mipmap-xhdpi:720P,表示1280x720分辨率,用于存放2x切图 mipmap-xxhdpi:1080P,表示1920x1080分辨率,用于存放3x切图 mipmap- ...

  9. Android手机屏幕适配知识整理

    目录 关于单位 关于屏幕密度 res包下的包命名 关于单位 概念: [px]pixels,像素 [sp]scaled pixels,缩放像素 [dp/dip]device independent pi ...

最新文章

  1. 【Udacity】异常值检测/删除
  2. android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解
  3. wxWidgets:wxFilterClassFactory类用法
  4. 一定要牢牢掌握的技术!Spark+Flink+推荐系统+数据挖掘等
  5. python 倒叙 数组_Python函数合集:68个内置函数请收好!
  6. ipv6相对于ipv4的改进
  7. BP神经网络的MATLAB实现
  8. MVC和WebApi中设置Area中的页为首页
  9. Docker镜像导致centos-root根分区容量爆满
  10. 微博短链接解析ShortUrl【PHP代码实现】
  11. Linux 安装 tomcat
  12. python优先级排序_Python 列表排序
  13. Atitit机器学习原理与概论book attilax总结
  14. mysql省市区三级联动数据库的源码(二)
  15. Sql代码美化工具:Sql Pretty Printer for SSMS V3.6.1
  16. FOC和SVPWM的C语言代码实现
  17. Vue 状态管理与与SSR详解
  18. application.properties详解 --springBoot配置文件
  19. 20v转5v_12v转5v_5v转3.3v 5A用AH8316
  20. Win10下adobe acrobat安装字体字体教程

热门文章

  1. simulink模块名称显示设置_GUI界面实现批量修改Simulink模块参数名称
  2. sqlmap的两种挂代理方式
  3. 北大正式成立智能学院,AI视觉大牛朱松纯任院长
  4. electron打包时报错could not find: “C:\Users\xxxx\AppData\Local\Temp\t-OLh5E0\0-messages.nsh“
  5. linux运行ardupilot,ardupilot在Linux上的启动过程
  6. 机器学习中的数据集切分
  7. Unity 2D骨骼动画2:创建真实动画
  8. 解决VS Code 运行 “conda : The term ‘conda‘ is not recognized as the name of a cmdlet, function, script “
  9. 喜欢计算机专业的理由英语作文,计算机专业英文自我评价范文
  10. Mybaits-Plus Invalid bound statement (not found) 问题