每英寸96 96用如何计算百分比比怎么算

android(101)
&239835人阅读&&&
【android 进阶之路】(73)&&【Android
快速开发】(11)&
转载请标明出处:&
大家在开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比。如果我们换个角度我们看下这个问题,不知道大家有没有了解过web,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率、包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象:
为什么Web页面设计人员从来没有说过,尼玛适配好麻烦?
那么,到底是什么原因,让网页的设计可以在千差万别的分辨率的分辨率中依旧能给用户一个优质的体验呢?带着这个疑惑,我问了下媳妇(前端人员),媳妇睁大眼睛问我:什么叫适配?fc,尼玛,看来的确没有这类问题。后来再我仔细的追问后,她告诉我,噢,这个尺寸呀,我都是设置为20%的~~追根到底,其实就是一个原因,网页提供了百分比计算大小。
同样的,大家拿到UI给的设计图以后,是不是抱怨过尼玛你标识的都是px,我项目里面用dp,这什么玩意,和UI人员解释,UI妹妹也不理解。那么本例同样可以解决Android工程师和UI妹妹间的矛盾~UI给出一个固定尺寸的设计稿,然后你在编写布局的时候不用思考,无脑照抄上面标识的像素值,就能达到完美适配,理想丰不丰满~~。
然而,Android对于不同的屏幕给出的适配方案是dp,那么dp与百分比的差距到底在哪里?
2、dp vs 百分比
我们首先看下dp的定义:
Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。&
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
好了,上述这些概念记不记得住没关系,只要记住一点dp是与像素无关的,在实际使用中1dp大约等于1/160inch。
那么dp究竟解决了适配上的什么问题?可以看出1dp = 1/160inch;那么它至少能解决一个问题,就是你在布局文件写某个View的宽和高为160dp*160dp,这个View在任何分辨率的屏幕中,显示的尺寸大小是大约是一致的(可能不精确),大概是 1 inch * 1 inch。
但是,这样并不能够解决所有的适配问题:
呈现效果仍旧会有差异,仅仅是相近而已当设备的物理尺寸存在差异的时候,dp就显得无能为力了。为4.3寸屏幕准备的UI,运行在5.0寸的屏幕上,很可能在右侧和下侧存在大量的空白。而5.0寸的UI运行到4.3寸的设备上,很可能显示不下。
以上两点,来自参考链接1
一句话,总结下,dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了。适配的问题还需要我们自己去做,于是我们可能会这么做:
&?xml version=&1.0& encoding=&utf-8&?&
name=&imagewidth&&120dip&
name=&imagewidth&&220dip&
&?xml version=&1.0& encoding=&utf-8&?&
name=&imagewidth&&80dip&
& 12345678910111213141516171234567891011121314151617
上述代码片段来自网络,也就是说,我们为了优质的用户体验,依然需要去针对不同的dpi设置,编写多套数值文件。
可以看出,dp并没有能解决适配问题。下面看百分比。
这个概念不用说了,web中支持控件的宽度可以去参考父控件的宽度去设置百分比,最外层控件的宽度参考屏幕尺寸设置百分比,那么其实中Android设备中,只需要支持控件能够参考屏幕的百分比去计算宽高就足够了。
比如,我现在以下几个需求:
对于图片展示的Banner,为了起到该有的效果,我希望在任何手机上显示的高度为屏幕高度的1/4我的首页分上下两栏,我希望每个栏目的屏幕高度为11/24,中间间隔为1/12slidingmenu的宽度为屏幕宽度的80%
当然了这仅仅是从一个大的层面上来说,其实小范围布局,可能百分比将会更加有用。
那么现在不支持百分比,实现上述的需求,可能需要1、代码去动态计算(很多人直接pass了,太麻烦);2、利用weight(weight必须依赖Linearlayout,而且并不能适用于任何场景)
再比如:我的某个浮动按钮的高度和宽度希望是屏幕高度的1/12,我的某个Button的宽度希望是屏幕宽度的1/3。
上述的所有的需求,利用dp是无法完成的,我们希望控件的尺寸可以按照下列方式编写:
android:text=&@string/hello_world&
android:layout_width=&20%w&
android:layout_height=&10%h&/&12341234
利用屏幕的宽和高的比例去定义View的宽和高。
好了,到此我们可以看到dp与百分比的区别,而百分比能够更好的解决我们的适配问题。
some 适配tips
我们再来看看一些适配的tips
多用match_parent多用weight自定义view解决
其实上述3点tip,归根结底还是利用百分比,match_parent相当于100%参考父控件;weight即按比例分配;自定义view无非是因为里面多数尺寸是按照百分比计算的;
通过这些tips,我们更加的看出如果能在Android中引入百分比的机制,将能解决大多数的适配问题,下面我们就来看看如何能够让Android支持百分比的概念。
3、百分比的引入
其实我们的解决方案,就是在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹。
然后我们根据一个基准,为基准的意思就是:
比如480*320的分辨率为基准
宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320高度为480,将任何分辨率的高度分为480份,取值为y1-y480
例如对于800*480的宽度480:
可以看到x1 = 480 / 基准 = 480 / 320 = 1.5 ;
其他分辨率类似~~&
你可能会问,这么多文件,难道我们要手算,然后自己编写?不要怕,下文会说。
那么,你可能有个疑问,这么写有什么好处呢?
假设我现在需要在屏幕中心有个按钮,宽度和高度为我们屏幕宽度的1/2,我可以怎么编写布局文件呢?
android:layout_gravity=&center&
android:gravity=&center&
android:text=&@string/hello_world&
android:layout_width=&@dimen/x160&
android:layout_height=&@dimen/x160&/&
12345678910111234567891011
可以看到我们的宽度和高度定义为x160,其实就是宽度的50%;&
那么效果图:
可以看到不论在什么分辨率的机型,我们的按钮的宽和高始终是屏幕宽度的一半。
对于设计图
假设现在的UI的设计图是按照480*320设计的,且上面的宽和高的标识都是px的值,你可以直接将px转化为x[1-320],y[1-480],这样写出的布局基本就可以全分辨率适配了。
你可能会问:设计师设计图的分辨率不固定怎么办?下文会说~
对于上文提出的几个dp做不到的
你可以通过在引入百分比后,自己试试~~
好了,有个最主要的问题,我们没有说,就是分辨率这么多,尼玛难道我们要自己计算,然后手写?
2、自动生成工具
好了,其实这样的文件夹手写也可以,按照你们需要支持的分辨率,然后编写一套,以后一直使用。
当然了,作为程序员的我们,怎么能做这么low的工作,肯定要程序来实现:
那么实现需要以下步骤:
分析需要的支持的分辨率
对于主流的分辨率我已经集成到了我们的程序中,当然对于特殊的,你可以通过参数指定。关于屏幕分辨率信息,可以通过该网站查询:
编写自动生成文件的程序
import java.io.F
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.PrintW
* Created by zhy on 15/5/3.
public class GenerateValueFiles {
private int baseW;
private int baseH;
private String dirStr = &./res&;
private final static String WTemplate = &&dimen name=\&x{0}\&&{1}px&/dimen&\n&;
private final static String HTemplate = &&dimen name=\&y{0}\&&{1}px&/dimen&\n&;
* {0}-HEIGHT
private final static String VALUE_TEMPLATE = &values-{0}x{1}&;
private static final String SUPPORT_DIMESION = &320,480;480,800;480,854;540,960;600,4;720,0;768,0;80,60;&;
private String supportStr = SUPPORT_DIMESION;
public GenerateValueFiles(int baseX, int baseY, String supportStr) {
this.baseW = baseX;
this.baseH = baseY;
if (!this.supportStr.contains(baseX + &,& + baseY)) {
this.supportStr += baseX + &,& + baseY + &;&;
this.supportStr += validateInput(supportStr);
System.out.println(supportStr);
File dir = new File(dirStr);
if (!dir.exists()) {
dir.mkdir();
System.out.println(dir.getAbsoluteFile());
* supportStr
w,h_...w,h;
private String validateInput(String supportStr) {
StringBuffer sb = new StringBuffer();
String[] vals = supportStr.split(&_&);
int w = -1;
int h = -1;
for (String val : vals) {
if (val == null || val.trim().length() == 0)
wh = val.split(&,&);
w = Integer.parseInt(wh[0]);
h = Integer.parseInt(wh[1]);
} catch (Exception e) {
System.out.println(&skip invalidate params : w,h = & + val);
sb.append(w + &,& + h + &;&);
return sb.toString();
public void generate() {
String[] vals = supportStr.split(&;&);
for (String val : vals) {
String[] wh = val.split(&,&);
generateXmlFile(Integer.parseInt(wh[0]), Integer.parseInt(wh[1]));
private void generateXmlFile(int w, int h) {
StringBuffer sbForWidth = new StringBuffer();
sbForWidth.append(&&?xml version=\&1.0\& encoding=\&utf-8\&?&\n&);
sbForWidth.append(&&resources&&);
float cellw = w * 1.0f / baseW;
System.out.println(&width : & + w + &,& + baseW + &,& + cellw);
for (int i = 1; i & baseW; i++) {
sbForWidth.append(WTemplate.replace(&{0}&, i + &&).replace(&{1}&,
change(cellw * i) + &&));
sbForWidth.append(WTemplate.replace(&{0}&, baseW + &&).replace(&{1}&,
sbForWidth.append(&&/resources&&);
StringBuffer sbForHeight = new StringBuffer();
sbForHeight.append(&&?xml version=\&1.0\& encoding=\&utf-8\&?&\n&);
sbForHeight.append(&&resources&&);
float cellh = h *1.0f/ baseH;
System.out.println(&height : &+ h + &,& + baseH + &,& + cellh);
for (int i = 1; i & baseH; i++) {
sbForHeight.append(HTemplate.replace(&{0}&, i + &&).replace(&{1}&,
change(cellh * i) + &&));
sbForHeight.append(HTemplate.replace(&{0}&, baseH + &&).replace(&{1}&,
sbForHeight.append(&&/resources&&);
File fileDir = new File(dirStr + File.separator
+ VALUE_TEMPLATE.replace(&{0}&, h + &&)
.replace(&{1}&, w + &&));
fileDir.mkdir();
File layxFile = new File(fileDir.getAbsolutePath(), &lay_x.xml&);
File layyFile = new File(fileDir.getAbsolutePath(), &lay_y.xml&);
PrintWriter pw = new PrintWriter(new FileOutputStream(layxFile));
pw.print(sbForWidth.toString());
pw.close();
pw = new PrintWriter(new FileOutputStream(layyFile));
pw.print(sbForHeight.toString());
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
public static float change(float a) {
int temp = (int) (a * 100);
return temp / 100f;
public static void main(String[] args) {
int baseW = 320;
int baseH = 400;
String addition = &&;
if (args.length &= 3) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
addition = args[2];
} else if (args.length &= 2) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
} else if (args.length &= 1) {
addition = args[0];
} catch (NumberFormatException e) {
System.err
.println(&right input params : java -jar xxx.jar width height w,h_w,h_..._w,h;&);
e.printStackTrace();
System.exit(-1);
new GenerateValueFiles(baseW, baseH, addition).generate();
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
同时我提供了jar包,默认情况下,双击即可生成,使用说明:
下载地址见文末,内置了常用的分辨率,默认基准为480*320,当然对于特殊需求,通过命令行指定即可:
例如:基准 1280 * 800 ,额外支持尺寸:1152 * 735;4500 * 3200;
&-jar xx.jar width height width,height_width,height
上述格式即可。
到此,我们通过编写一个工具,根据某基准尺寸,生成所有需要适配分辨率的values文件,做到了编写布局文件时,可以参考屏幕的分辨率;在UI给出的设计图,可以快速的按照其标识的px单位进行编写布局。基本解决了适配的问题。
本方案思想已经有公司投入使用,个人认为还是很不错的,如果大家有更好的方案来解决屏幕适配的问题,欢迎留言探讨或者直接贴出好文链接,大家可以将自己的经验进行分享,这样才能壮大我们的队伍~~。
注:本方案思想来自Android Day Day Up 一群的【blue-深圳】,经其同意编写此文,上述程序也很大程度上借鉴了其分享的源码。在此标识感谢,预祝其创业成功!
===&后期更新
Google已经添加了百分比支持库,详情请看:
群号:,欢迎入群
公众号:hongyangAndroid&
(欢迎关注,第一时间推送博文信息)&
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:55724次
积分:1492
积分:1492
排名:千里之外
原创:60篇
转载:108篇
评论:22条
(57)(23)(7)(17)(13)(7)(9)(15)(1)(2)(3)(3)(1)(6)(4)(2)(1)(1)求大神帮忙,怎么把一张照片修改成20k,178*220,每英寸96*96点【ps吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2,211,209贴子:
求大神帮忙,怎么把一张照片修改成20k,178*220,每英寸96*96点收藏
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或君,已阅读到文档的结尾了呢~~
在网页设计css中,经常用到字体,而字体大小的设置单位,常用的有2种:px、pt。这两个有什么区别呢?  先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点;而pt就是point,是印刷行业常用单位,等于1 72英寸。  这样很明白,px是一个点,它不是自然界的长度单位,谁能说出一个“点”有多长多大么?可以画的很小,也可以很大。如果点很小,那画面就清晰,我们称它为“分辨率高”,反之,就是“分辨率低”..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
【转】常用长度单位PX EM PT 百分比转换公式
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口请使用支持脚本的浏览器!
该日志尚未公开,你暂时不能查看。博主可在此
不如去逛逛吧。
网易公司版权所有&&&您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
调整 Windows 窗体的大小与比例.doc 16页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:250 &&
你可能关注的文档:
··········
··········
调整Windows窗体的大小和比例.NETFramework4.5其他版本此主题尚未评级?-?评价此主题本节内容如何:调整Windows窗体的大小提供有关指定Windows窗体大小的说明。Windows窗体中的自动缩放讨论自动缩放功能如何使窗体及其控件在计算机之间正确地显示。参考Size描述此类并提供指向其所有成员的链接。TableLayoutPanel描述此类并提供指向其所有成员的链接。FlowLayoutPanel描述此类并提供指向其所有成员的链接。相关章节更改Windows窗体外观提供指向一些主题的链接,这些主题描述更改Windows窗体外观的其他方法。如何:使用设计器调整Windows窗体的大小.NETFramework4.5其他版本此主题尚未评级?-?评价此主题有多种方式可指定Windows窗体的大小。?在VisualStudio中,可以通过使用“Windows窗体设计器”或“属性”窗口来更改窗体的大小。?有关通过使用代码更改窗体大小的信息,请参见如何:调整Windows窗体的大小。?说明
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。?若要更改设置,请在“工具”菜单上选择“导入和导出设置”。?有关更多信息,请参见?VisualStudio设置。
在Windows窗体设计器中调整窗体的大小在Windows窗体设计器中,单击该窗体以选定它。单击并拖动窗体边框上出现的八个尺寸柄中的一个。?尺寸柄看起来象小白框,当鼠标指向它时,鼠标指针变成双箭头。?说明
按下Shift键的同时按箭头键使您可以更精确地调整窗体的大小。
使用“属性”窗口调整窗体的大小在“属性”窗口中,单击?Size?属性并输入宽度和高度的值,两值中间用逗号隔开。?说明
可以展开“大小”属性来分别输入“宽度”和“高度”值。
请参见任务演练:创建可根据数据输入需要调整大小的Windows窗体演练:创建可根据本地化需要调整比例的布局如何:使用AutoSize属性和TableLayoutPanel控件支持对Windows窗体的本地化如何:调整Windows窗体上控件的大小参考Windows窗体概述概念Windows窗体中的自动缩放其他资源调整Windows窗体的大小和比例创建新的Windows窗体 如何:调整Windows窗体的大小.NETFramework4.5其他版本可以通过几种方式指定Windows窗体的大小。?可以为?Size?属性设置新的值以便用编程方式来更改窗体的高度和宽度,还可以单独调整?Height?或?Width?属性。?如果使用VisualStudio,则可以使用Windows窗体设计器来更改大小。以编程方式调整窗体的大小Size?属性,可以在运行时定义窗体的大小。下面的代码示例显示设置为100×100像素的窗体大小:C#C++VBForm1.Size=NewSystem.Drawing.Size(100,100)以编程方式更改窗体的宽度和高度Size?后,请使用?Width?或?Height?属性更改窗体的高度或宽度。下面的代码示例演示将窗体宽度设置为距窗体左边缘300个像素,而高度保持不变。C#C++VBForm1.Width=300-或-通过设置?Size?属性,更改?Width?或?Height。但是,如以下代码所示,与仅设置?Width?或?Height?属性相比,此方法要麻烦的多。C#C++VBForm1.Size=NewSize(300,Form1.Size.Height)以编程方式按增量更改窗体大小Width?和?Height?属性。下面的代码示例显示设置为比当前设置宽200像素的窗体宽度。C#C++VBForm1.Width+=200警告
请始终使用?Height?或?Width?属性来更改窗体的维度,除非要通过将?Size?属性设置为新的?Size?结构来同时设置高度和宽度维度。?Size?属性返回?Size?结构,该结构为值类型。?无法为值类型的该属性赋新值。?因此,下面的代码示例将不会编译。
C++VB'NOTE:CODEWILLNOTCOMPILEDimfAsNewForm()f.Size.Width+=100请参见其他资源增强Windows窗体应用程序演练:创建可根据数据输入需要调整大小的Windows窗体.NETFramework4.5其他版本能够正确调整大小的窗体可以提高您的用户界面的易用性。此演练演示了如何创建当用户调整窗体大小时按比例调整的布局。?您将使用?TableLayoutPanel?控件实现一个接收联系人信息的数据输入窗体。本演练涉及以下任务:创建项目创建布局面板设置布局网格创建“姓名”字段创建“地址”字段创建“电话号码”字段创建“备注”字段完成这些操
正在加载中,请稍后...}

我要回帖

更多关于 如何计算百分比 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信