一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊。

以下得出的结论主要是结合官方文档进行分析的https://developer.android.com/guide/practices/screens_support.html

android由于碎片化太严重,而导致市面上出现非常多的种类尺寸手机设备,当然也包括非常奇葩的分辨率手机。所以我们在布局的时候使用px作为单位显然不能很好的做到多屏幕的适配。其实在官方文档中有介绍一种解决多屏幕适配的问题的尺寸单位dp/dip(Density-independent pixel )

文档中也给出了px和dp之间的关系表达式:px = dp * (dpi / 160) 其中dpi表示的是设备屏幕密度,不同的设备dpi可能不一致。

例如在一个dpi为240的设备屏幕中,1个dp等价于2个px,也就是一个dp长度下包含2个px,如果dp与px的倍数越大,屏幕看起来也就越清晰。

谷歌已经针对dpi进行了分类:

  • A set of six generalized densities:

    • ldpi (low) ~120dpi
    • mdpi (medium) ~160dpi
    • hdpi (high) ~240dpi
    • xhdpi (extra-high) ~320dpi
    • xxhdpi (extra-extra-high) ~480dpi
    • xxxhdpi (extra-extra-extra-high) ~640dpi

上述表述可以看出他是一个区间的,并不是一个固定的值。

基于px和dp的关系式。假如在屏幕像素为800*1280,dpi为240的设备上,dp的总长度只有600dp

在屏幕像素为800*1280 ,dpi为320的设备上,dp的总长度只有400dp

以下是测试代码,来验证dp的实际长度

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#f00"
android:src="@drawable/ic_launcher" /> <ImageView
android:layout_width="100dip"
android:layout_height="40dip"
android:src="#0f0" /> <ImageView
android:layout_width="200dip"
android:layout_height="40dip"
android:src="#0fa" /> <ImageView
android:layout_width="300dip"
android:layout_height="40dip"
android:src="#0ff" /> <ImageView
android:layout_width="400dip"
android:layout_height="40dip"
android:src="#09f" /> </LinearLayout>

720*1280  320dpi                        480*800   160dpi                                   480*800   240dpi

dp总长度为360dp                           dp的总长度为480dp                                 dp的总长度为320dp

                           

总结一

一般情况下如果屏幕分辨率和屏幕密度成一定比例的关系,那么不管分辨率多大,得出的dp总长度将会在一定的范围内。那么使用dp作为单位将能很好的解决多分辨率适配的问题。

然而由于设备屏幕分辨率和屏幕密度并不是成一个固定的比例,所以全部用dp的写,似乎不是很好。建议使用warp_content 和match_parent来配合使用。对于布局的高宽没有明确限制的,尽量结合相对布局和权重来表示,这样不管在什么分辨率下,界面的样式不会错乱。

Android 多屏幕适配 dp和px的关系的更多相关文章

  1. Android 多屏幕适配 dp和px的关系 最好用dp

    Android 多屏幕适配 dp和px的关系 一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的ht ...

  2. Android屏幕适配dp、px两套解决办法

    "又是屏幕适配,这类文章网上不是很多了吗?" 我也很遗憾,确实又是老问题.但本文重点对网上的各种方案做一个简短的总结,和具体使用方法. 若想了解具体Android设备适配的前世因果 ...

  3. android: android中dip、dp、px、sp和屏幕密度

    android中dip.dp.px.sp和屏幕密度 转自:http://www.cnblogs.com/fbsk/archive/2011/10/17/2215539.html 1. dip: dev ...

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

    )密度无关像素,单位为dp,是Android特有的单位 Android开发时通常使用dp而不是px单位设置图片大小,因为它可以保证在不同屏幕像素密度的设备上显示相同的效果. /** * dp与px的转 ...

  5. Android实习生 —— 屏幕适配及布局优化

    为什么要进行屏幕适配.对哪些设备进行适配?在近几年的发展当中,安卓设备数量逐渐增长,由于安卓设备的开放性,导致安卓设备的屏幕尺寸大小碎片化极为严重.从[友盟+]2016年手机生态发展报告H1中看截止1 ...

  6. Android上dip、dp、px、sp等单位说明

    Android上dip.dp.px.sp等单位说明 dip  device independent pixels(设备独立像素). 不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA ...

  7. Android各种屏幕适配原理

    dip(dp): device independent pixels(设备独立像素) dip,就是把屏幕的高分成480分,宽分成320分.比如你做一条160dip的横线,无论你在320还480的模拟器 ...

  8. android 多屏幕适配 : 第一部分

    1.在xml布局文件中,控件的宽度和高度用  dp ;   字体大小用 sp 2.根据屏幕的宽高来动态的适配 , 获取屏幕的宽高的两种方法: 第一种方法: /** * 屏幕的宽度 * 屏幕的高度 * ...

  9. Android 多屏幕适配

    问题: 测试时,发现应用在不同的显示器上显示效果不同(部分文本不能显示完全),自然想到屏幕适配的问题. 按照思路整理如下: (一) 几个概念 1, Screen size 屏幕的尺寸,即对角线长度(单 ...

随机推荐

  1. Chino的成绩(chino的公开赛T3)

    题目背景 曾经幻想过未来的风景 或许有着另外一片天 小镇的远方 有着深远的回忆 也有着富有深情的诗篇 题目描述 Chino非常注重自己的成绩 Chino有 m 种方式给自己增加 rp 以增加成绩,她的 ...

  2. 通过Ambari2.2.2部署HDP大数据服务

    node1 amari-server   node2 amari-agent namenode1,datanode,resourcemanager,zk node3 amari-agent namen ...

  3. YII2.O学习三 前后台用户数据表分离

    之前我们完成了Advanced 模板安装,也完成了安装adminlte 后台模板,这一步是针对前端和后台用户使用不同的数据库表来管理,做到前后台用户分离的效果: 复制一张user数据表并重命名为adm ...

  4. ruby 数据类型String

    一.字符串创建 单引号包含,不支持转义符和内嵌表达式#{}(插值符) str = 'hello world!' 双引号包含 str = "hello world!" 使用%,%Q, ...

  5. unity独立游戏开发日记2018/09/27

    今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...

  6. 计蒜客-----跳跃游戏(C语言)

    /********************************************************给定一个非负整数数组,假定你的初始位置为数组第一个下标.数组中的每个元素代表你在那个位 ...

  7. nodejs环境变量配置

    步骤 创建文件夹:安装包 配置环境变量: export NODE_HOME=/root/安装包/node-v7.6.0-linux-x64 export PATH=$NODE_HOME/bin:$PA ...

  8. Fragment保持状态切换

    在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...

  9. TFS权限配置

            装了TFS,要给TFS里添加用户,然后分配权限.其实一般项目中权限都不会控制的那么细,所以就直接想给项目组的每个人建一个用户,让他们都能访问这个项目的代码并进行任何操作.只想怎么简单怎 ...

  10. formValidator 不支持jquery1.9以上的解决办法

    不支持的原因是因为jquery1.9以上版本剔除了$.browser 在formValidator 源码最顶层.或者jquery源码里加上如下代码 $.browser = {};$.browser.m ...