0 赞 0 踩
其他回答
作为一个经常拿着计算器算长宽,然后给 Android 应用各个分辨率提供界面切图的死美工,我想尝试回答一下后半个问题,也就是为啥以 160 dpi 作为基准:
Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi
话说我觉得在给 Android 的应用提供切图的时候经常像是在算 24 点。。。
[1] http://developer.android.com/design/style/devices-displays.html JJ Ying 3小时前 0条评论
Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi
实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75 来给界面中的元素来进行尺寸定义。
也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。
但假设以 240 dpi 作为标准,那需要 DP 是 3 的倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2
而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi
话说我觉得在给 Android 的应用提供切图的时候经常像是在算 24 点。。。
[1] http://developer.android.com/design/style/devices-displays.html JJ Ying 3小时前 0条评论
0 赞 0 踩
1.在Xdpi下绘制Xpx长度,实际的物理距离都是1英寸,为什么一定要选160呢?
答:这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
因为我查过T-Mobile G1的DPI,其实它准确的DPI不等于160,G1的配置信息如下:
分辨率480 x 800,屏幕尺寸4.3英寸和分辨率540 x 960,屏幕尺寸4.5英寸的DPI分别是:
如果按照这样的计算方式的话,T-Mobile G1应该为180dpi,这个计算大家可以使用计算器或者手动的计算方式得出,为了更具说服力,我贴出自己的计算截图(使用DPI Caculator计算)
大家可以看到计算出来的结果是180而不是160,大家会想那为什么不直接用180作为基准(mdpi)而是160呢?这就好像为什么是二进制而不是其他进制,就像@JJ Ying说的,180上下不好做适配,但是160无论是乘以0.5/2/1.5都很好适配,这就是为什么我说属于而不是等于,Android其实为了不至于为每一个设备制造商做适配(其实资源文件的分包就算适配了:drawable-hdpi,drawable-ldpi),将不同屏幕大小和不同dpi的设备大致划分为四类,如下图:
大家可以看到T-Mobile G1的参数属于mdpi区域的,以上就是取160dpi作为基准的原因。
2.如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?为什么要引入dp?
如果有兴趣可以看一下这个类的源码(网址):GrepCode: android.util.DisplayMetrics (.java) ,这个类中有很详细的dpi相关的成员函数和变量,下面的代码是在开发时获取dpi的代码,
(1)我先回答前半部分,“如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?”
答:我认为设置宽高为厘米/英寸,然后先通过上面代码动态计算dpi的值,然后再根据计算出的dpi计算出显示控件需要的宽和高是可行的,但是绝对不是更好,而是非常差,因为开发的原则遵循的是界面设计和功能逻辑分离,在程序中每次都首先需要计算一下dpi才能设定其他控件的宽高属性是很不友好的,你想想,你启动了某个程序,它界面一直出不来,后台还在计算着DPI,用户体验也不会好,超过5s估计就被当作ANR给kill掉了。
(2)为什么要引入dp?
答:dp实际是dip(density independent pixel),独立密度像素,意思就是与density密度(dpi)无关,我使用dp作为单位设置控件,不管你什么屏幕大小,多大的dpi,显示的效果始终保持一致。假如我们不引入dp,还是使用原始的px,现在我们需要在手机屏幕上绘制一条直线,在160dpi(每英寸160个像素点),而宽度是1英寸的手机上做开发和测试工作,我们设置这条直线长度是160px(占据160个像素点),也就是直线长度正好是手机的宽度,开发工作完成,我们把app发布到市场上,这时候JJ Ying用他同样宽度1英寸,但是240dpi的手机安装了这个app,他能不抓狂!本该长度有屏幕这么宽的线视觉上只有原来的2/3,如果整个UI都使用px作为单位,就会有如下的效果。
热心网民 3小时前 0条评论
答:这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
The generalized sizes and densities are arranged around a baseline configuration that is a normal size and mdpi(medium) density. This baseline is based upon the screen configuration for the first Android-powered device, the T-Mobile G1, which has an HVGA screen (until Android 1.6, this was the only screen configuration that Android supported).为什么说是属于呢?
因为我查过T-Mobile G1的DPI,其实它准确的DPI不等于160,G1的配置信息如下:
- 屏幕尺寸:3.2 寸(8.1 厘米)
- 分辨率:320 x 480(HVGA)
2.如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?为什么要引入dp?
如果有兴趣可以看一下这个类的源码(网址):GrepCode: android.util.DisplayMetrics (.java) ,这个类中有很详细的dpi相关的成员函数和变量,下面的代码是在开发时获取dpi的代码,
DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);iDensity = (int)( metrics.density * 160 );
(1)我先回答前半部分,“如果设定宽高为厘米,或者英寸之类的物理单位,屏幕根据dpi的大小来计算要显示多少像素才能达到这个物理单位,不是更好?”
答:我认为设置宽高为厘米/英寸,然后先通过上面代码动态计算dpi的值,然后再根据计算出的dpi计算出显示控件需要的宽和高是可行的,但是绝对不是更好,而是非常差,因为开发的原则遵循的是界面设计和功能逻辑分离,在程序中每次都首先需要计算一下dpi才能设定其他控件的宽高属性是很不友好的,你想想,你启动了某个程序,它界面一直出不来,后台还在计算着DPI,用户体验也不会好,超过5s估计就被当作ANR给kill掉了。
(2)为什么要引入dp?
答:dp实际是dip(density independent pixel),独立密度像素,意思就是与density密度(dpi)无关,我使用dp作为单位设置控件,不管你什么屏幕大小,多大的dpi,显示的效果始终保持一致。假如我们不引入dp,还是使用原始的px,现在我们需要在手机屏幕上绘制一条直线,在160dpi(每英寸160个像素点),而宽度是1英寸的手机上做开发和测试工作,我们设置这条直线长度是160px(占据160个像素点),也就是直线长度正好是手机的宽度,开发工作完成,我们把app发布到市场上,这时候JJ Ying用他同样宽度1英寸,但是240dpi的手机安装了这个app,他能不抓狂!本该长度有屏幕这么宽的线视觉上只有原来的2/3,如果整个UI都使用px作为单位,就会有如下的效果。
Example application without support for different densities, as shown on low, medium, and high density screens.上面这张图来自Google的开发网站。如果引入dp这个单位,这种问题就不会发生了,还是以上面的例子说明,如果在160dpi的设备上使用的是160dp,无论移植到240,120dpi上显示效果都是一致的。px和dp的换算公式,效果如下图:
0 赞 0 踩
登录后可回答 提交回答
关键词 :
- 上一个:你如何看待黑龙江省2017年住院医师规范化培训结业考核的西医辅助结果判读考试?
- 下一个:刘振亚告别国网后对山东大学的电气工程学院的影响?
推荐资讯
点击排行