android 布局如何支持多种不同屏幕尺寸
--关于dp、layout-xxx、drawable-xxx作用的小结
转载自:http://blog.csdn.net/vincent_blog/article/details/8547851
支持多种屏幕
android运行在不同尺寸和像素(密度)的设备上,android系统给应用程序提供了一个相同的环境去适应不同的UI显示界面。同时系统提供API让应用程序去控制UI在不同尺寸和密度的屏幕上的显示效果,因为我们肯定不希望在手机和平板上显示一样的效果。
尽管android系统会自动缩放你的应用程序以适应不同分辨率,但是你也必须针对不同尺寸和密度的屏幕尽量优化,只有这样才能最大程度上获得较好的用户体验。
概念
1.屏幕尺寸(Screen size):也就是我们常听到的iphone4 3.5寸
iphone4s 4寸 samsung s2 4.3寸 HTC butterfly 5寸等等,也就是屏幕的对角线长度,
然后你可以根据屏幕的长宽比计算长宽的尺寸(android
将这些分为四个等级,分别是small,normal, large,
和 extralarge)
2.像素密度(dpi):每英寸屏幕含有的像素点个数 (android
也按照像素密度分了四个等级,分别是low,medium, high,
和 extrahigh)
3.方向(Orientation):分水平和垂直,如果应用做的好的话,这两个方向都要考虑
4.分辨率(pix):也就是整个屏幕有多少个像素点组成,如果想应用程序支持不同的屏幕,那应用程序绝对不能直接根据分辨率作为单位来布局,而是应该
通过屏幕尺寸和像素密度中设定的等级来区分
5.像素无关密度(dp/dip):
一个android定义的虚拟的像素单位,你的应用程序应该用此单位来定义布局大小和位置
注意,一个dp和一个大小为160dpi的屏幕中的一个像素是相等的,所以dp和pix的换算应该是这样的real
pix =dp * (dpi)/160
当你写布局文件的时候可以根据这个公式大概估算一下
(如800*480 4寸屏,计算像素密度dpi =
根号[宽的平方 +
高的平方]/屏幕尺寸,
大概算一下是240dpi左右,也就是说你定义了一个button是100dp
宽,100dp高那么实际就是100*240/160 = 150 pix
了,也就是说你这个button占据了屏幕的150/800 +150/480 ,
如1920*1080 5寸屏,计算像素密度dpi =
根号[宽的平方 +
高的平方]/屏幕尺寸,大概算一下是440dpi左右,也就是说你定义了一个button是100dp
宽,100dp高那么实际就是100*440/160 = 275 pix
了,也就是说你这个button占据了屏幕的275/1920 +275/1080 。
当然这两款手机上的显示效果还是有些差距的,计算了一下前者的button宽占据了整个屏幕宽度的0.1875 而后者的button宽占据了整个屏幕的0.1432。
可以看出来前者占据的位置要大一些,这样看起来在不同分辨率和大小的手机上效果就不太一样了。其原因在于后者的分辨率比前者大很多,但是尺寸仅仅大了一寸,这也跟厂家的定位有关系吧,尺寸小其实是根本没必要弄太大的分辨率的,因为根本看不出效果来。因此我们有必要对不同尺寸的定义不同的布局文件!!!
android 对不同尺寸不同像素密度等级划分:
实际尺寸(尺寸等级) 2(small)
4(normal) 7(large)
10(xlarge)
实际像素密度 100 200 300
像素密度等级 ldpi(120) mdpi(160) hdpi(240) xhdpi(340)
寸应该定义两个layout,layout定义button的长宽为100dp,layout-large
定义button的长宽大概为131dp ;
131*440/160 = 360 ,360/1920 = 0.1875 这样就和在寸屏幕中所占的比例相同了
android 布局如何支持多种不同屏幕尺寸的更多相关文章
- android屏幕适配的全攻略--支持不同的屏幕尺寸适配平板和手机
一. 核心概念与单位详解 1. 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕分辨率越大,手机越清晰 dpi就是dot per inch dot意思是点,就是每英寸上面的像素点数 android原始 ...
- android做设计的每一个屏幕尺寸和分辨率(一个)
一个.与分辨率无关 1.使用dp(dpi) Android密度不依赖像素(dp)指定屏幕尺寸,它同意不同的屏幕尺寸和像素密度类似设备通过缩放来达到同样的效果. (不解决不同屏幕尺寸的问题?) 2.的资 ...
- 创建支持多种屏幕尺寸的Android应用
Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的用户界面到它显示的屏上.与此同时,系统提供 ...
- 创办支持多种屏幕尺寸的Android应用
创建支持多种屏幕尺寸的Android应用 Android涉及各种各样的支持不同屏幕尺寸和密度的设备.对于应用程序,Android系统通过设备和句柄提供了统一的开发环境,大部分工作是校正每一个应用程序的 ...
- ym——Android怎样支持多种屏幕
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 原文链接:http://developer.android.com/guide/pra ...
- Android应用程序支持不同屏幕(尺寸、密度)
how to build a user interface using Android layouts for all types of devices 使用Android布局设计的UI接口用于不同的 ...
- 创建支持多种屏幕尺寸的apk
文章转至:http://hell0android.iteye.com/blog/1899605 创建对两种以上屏幕尺寸的多apk支持(Creating Multiple APKs with 2+ Di ...
- Android - 支持不同的设备 - 支持不同的屏幕
Android整体上按照两大类来分类设备屏幕:尺寸和分辨率.app在设备上运行应该考虑大小和分辨率.同样的,你应该包含不同的资源来让app适应不同的屏幕大小和分辨率. 整体上有四种尺寸:小的,正常的, ...
- 设计兼容不同的屏幕尺寸的Android界面
Android的屏幕类型有几百种不同的尺寸,从小型的手机到大型的电视机.因此要使我们的应用程序兼容不同屏幕尺寸,才可以让我们的应用提供给更多的用户使用. 一.支持不同的屏幕尺寸 1.使用"w ...
随机推荐
- phpmailer,smtp发送邮件实例(转)
一,用phpmailer发送邮件 查看复制打印? <?php include "class.phpmailer.php"; //包函邮件发送类 //邮件发 ...
- Linux下history命令详解---转载
Linux下History命令主要用于显示历史指令记录内容, 下达历史纪录中的指令 . >History命令语法:[www.linuxidc.com@linux]# history [n][ww ...
- Lua开发环境搭建(Mac)
1.下载最新版的Lua,点击下载 2.下载完成后,解压压缩包,打开终端,cd进入Lua解压目录下 3. 在终端输入“make macosx”,编译lua 4.编译完成后,在终端输入”make test ...
- Java为什么会超时
java程序,最终是转成c运行的,我们写的程序会转成c代码,并且由底层的c程序调用,可以理解成我们程序最后变成被调用的c函数 底层的C程序是java虚拟机,由它读取我们的.class文件,翻译成c ...
- “DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常
今天遇到了一个这样的问题“DBUtility.DbHelperSQL”的类型初始值设定项引发异常“DBUtility.DbHelperSQL”的类型初始值设定项引发异常 也许有和我遇到这问题的人也在这 ...
- 利用C语言强行点击置灰的按钮
通常很多情况下,会有这样的事情,就是: 我们在运行某些程序的时候,发现按钮置灰了,比如购买版权或者输入序列号才能够获得访问权限.某个按钮才允许点击. 其实所有的这些东西都是 别的人或者公司利用一些编程 ...
- Ubuntu14.04 固定IP
Ubuntu 固定IP 1. 更改/etc/network/interfaces的内容 1.1 注释掉原来的内容 1.2 添加以下内容 auto eth0 iface eth0 inet static ...
- CountDownLatch(倒计时计数器)使用说明
方法说明: public void countDown() 递减锁存器的计数,如果计数到达零,则释放所有等待的线程.如果当前计数大于零,则将计数减少.如果新的计数为零,出于线程调度目的, ...
- 跨时钟域设计【一】——Slow to fast clock domain
跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...
- YII设置用户访问过滤
设置用户访问过滤 1.哪个控制器设置访问过滤,就在哪个控制器中添加如下代码 class XxxController extends Controller { //当前控制器是否使用过滤功能 publi ...