我做了很多研究,但我觉得我还不太了解如何支持不同屏幕尺寸的整个系统。
所以我的设计师想知道我想要支持哪些屏幕尺寸,他想知道最初要构建哪种分辨率。
所以我建议我想支持以下内容,
屏幕尺寸正常
mdpi - 是的
hdpi - 是的
xhdpi - 是的
到目前为止,我假设了以下内容,
正常屏幕mdpi - 320x480 - 160ppi 正常屏幕hdpi - 480x800 - 240ppi 正常屏幕xhdpi - 640x960 - 320ppi
问题是如何为屏幕定义资源? 720x1280?我是否使用为640x960定义的资源?
像S3这样的东西
答案 0 :(得分:6)
我已经在这里application-skeleton-to-support-multiple-screen提到了设计师的观点。
列出了设备屏幕的百分比差异
Ldpi- 75%
Mdpi- 100%
Hdpi- 150%
XHdpi- 200%
但是我们现在知道大多数设备都带有 480X800 ,所以我认为这是基于设备,所以我们的新计算会喜欢这个
Ldpi- 50%
Mdpi- 66.67%
Hdpi- 100%
XHdpi- 133.33%
您可以将XHdpi
作为基础,因为当我们放大较小的图像时,图像会变得模糊,因此开始制作更大尺寸的图稿然后再缩小。
现在关于具有高分辨率 720x1280 即S3
的设备你有Android V3.0 Honeycomb引入的最小宽度概念(SW)的限定符
抽拉-SW ??? DP
设备被分类为屏幕宽度,因此如果我们创建名为drawable-sw360dp
的文件夹,那么720dp(宽度或高度)的设备将使用this
文件夹中的资源。
例如找到三星Galaxy S3 dp为后缀drawable-sw?dp
参考DP Calculation,如果您想支持您的布局或可绘制到S3,那么计算显示
px =设备宽度= 720
dpi =设备密度= 320
给出的公式
px = dp * (dpi / 160)
交换公式,因为我们有px的值
dp = px / (dpi / 160)
现在放价值,
dp= 720 / (320/160);
dp=360.
所以drawable-sw360dp
将完成S3的工作
从GsmArena获取设备配置,同样您也可以为不同的设备创建文件夹(笨拙/最新的)
您也可以为布局文件夹添加相同的值layout-sw360dp
答案 1 :(得分:2)
我也同意在Android开发者网站上发布Supporting Multiple Screens链接的其他人,因为它是了解屏幕类(小型,普通型,大型)之间差异的绝佳资源和不同的屏幕密度(ldpi,mdip,hdpi)。
还有一篇关于Metrics and Grids的非常有趣的文章,它帮助了我很多。
你还应该保持像素的比例在你的脑后蘸:
ldpi: 1dp = 0.75px
,mdpi: 1dp = 1px
,hdpi: 1dp = 1.5px
和xhdpi: 1dp = 2px
我个人喜欢将ldpi与分辨率约为240x320,mdpi与320x480,hdpi与480x800以及xhdpi相关联,如SGS3。
例如,指向Metrics and Grids的链接指出按钮应至少为48dp。
这意味着,如果您要创建大小为48x48
的按钮(转换为48x48 px for mdpi
),您还必须提供96x96 px for xhdpi
,72x72 px for hdpi
和{的图形{1}}。
我还建议您和您的设计师查看9-patch images并尝试调整您的UI。这将使您作为开发人员的生活减少麻烦。 这样做的原因是您可以创建小尺寸图像,这些图像可以在整个应用程序中进行非常好的扩展。
很明显,您应该尝试以尽可能高的分辨率(例如xhdpi)创建图形,然后缩小到hdpi,mdpi和ldpi。
我遇到的另一个提示,我没有源代码,是使用Android中的资源文件夹,因为与仅提供大图像相比,它会更好地提高性能,并让操作系统在旅途中缩小它。 (But this SO post has some valid arguments in the answers)
答案 2 :(得分:0)
您可以将SVG
库用于矢量图形,对于支持多分辨率屏幕非常有用,源代码为here
答案 3 :(得分:0)
你应该尝试这样的事情: 用于从displayPixels转换为Pixels
(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
和像素到screenPixels
(pixels / context.getResources().getDisplayMetrics().scaledDensity);