如何将UI小部件维度从iPhone4Retina更改为Android 预期结果

如何将UI小部件维度从iPhone4Retina更改为Android 预期结果,android,ios,user-interface,multiscreen,Android,Ios,User Interface,Multiscreen,我有一些UI小部件,它们的尺寸是为iPhone4Retina设备设计的。该单位以像素为单位,例如,按钮宽30像素,高30像素。我想把设计风格复制到Android设备上,比如说之前的30乘30按钮,占iPhone 4视网膜屏幕宽度的30/640=4.6875%,占屏幕高度的30/960=9.375%,那么我预计它也占Android设备屏幕宽度的4.6875%,占屏幕高度的9.375% 问题 不知道以下代码中使用的iPhone4视网膜设备的尺寸比例因子 代码 参考文献 iPhone 4视网膜 生产者

我有一些UI小部件,它们的尺寸是为iPhone4Retina设备设计的。该单位以像素为单位,例如,按钮宽30像素,高30像素。我想把设计风格复制到Android设备上,比如说之前的30乘30按钮,占iPhone 4视网膜屏幕宽度的30/640=4.6875%,占屏幕高度的30/960=9.375%,那么我预计它也占Android设备屏幕宽度的4.6875%,占屏幕高度的9.375%

问题 不知道以下代码中使用的iPhone4视网膜设备的尺寸比例因子

代码 参考文献 iPhone 4视网膜

生产者价格指数:326

分辨率:640 x 960像素

大小比例因子:未知

三星Galaxy S

生产者价格指数:233

分辨率:480 x 800像素

尺寸比例系数:1.5

三星Galaxy Note

生产者价格指数:285

分辨率:800 x 1280像素


大小比例因子:2

有几种观点值得考虑。 但我只是遵循一个简单的方法:

px->dp

我的图像资源位于xhdpi文件夹中,使用iphone的图像

假设在ios中有一个像素值,例如10

如果您想获得android设备的像素值:

DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(dm);

SCREEN_DENSITY = dm.density;
SCREEN_WIDTH_DP = (int) (SCREEN_WIDTH_PIXELS / dm.density);

public static int getScaledWidthPixelsByDP(int desingDP) {
    double v = desingDP / 320f * SCREEN_WIDTH_PIXELS;
    return (int) v;
}

假设iPhone4Retina版本的大小比例因子为2.0(Android中的xhdpi),我做了一个非常简单的解决方法,只需使用dp单位将这些像素值的一半赋予它们。所以30pxby30px按钮在xml文件中变成了15dpby15dp。看起来不错,可以在谷歌Nexus、三星Galaxy S、S2、S4、Note、Note2上使用。不使用dp2px和px2dp方法。

期望Android设备上的宽度/高度百分比相同,这意味着您假设所有设备具有相同的屏幕宽高比。事实并非如此,因此不会有一对一的映射。无论如何,326 ppi意味着
xhdpi
,或与注释相同的
2.0
比例因子(以
mdpi
为基线)。另请阅读:。您对iPhone 4 Retina使用320f,这意味着它的比例因子为2.0?Retina没有精确的比例iPhone~2.0左右,如果这对您有帮助,我将非常高兴!
DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(dm);

SCREEN_DENSITY = dm.density;
SCREEN_WIDTH_DP = (int) (SCREEN_WIDTH_PIXELS / dm.density);

public static int getScaledWidthPixelsByDP(int desingDP) {
    double v = desingDP / 320f * SCREEN_WIDTH_PIXELS;
    return (int) v;
}