0

预期结果

我有一些 UI 小部件,其尺寸是为 iPhone 4 Retina 设备设计的。单位是像素,例如一个 30 像素宽 x 30 像素高的按钮。我想将设计风格复制到 Android 设备中,比如之前的 30 x 30 按钮,在 iPhone 4 Retina 中占用 30/640 = 4.6875% 的屏幕宽度和 30/960 = 9.375% 的屏幕高度,那么我也期望它占用 Android 设备屏幕宽度的 4.6875%,屏幕高度的 9.375%。

问题

不知道以下代码中使用的 iPhone 4 Retina 设备的尺寸比例因子。

代码

/**
 * Change dip value to pixel value using density of current device
 */
public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    Log.d("ch", "density of current device : " + scale);
    return (int) (dpValue * scale + 0.5f);
}

/**
 * Change pixel value to dip value using density of current device
 */
public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
Log.d("congliu", "density of current device : " + scale);
    return (int) (pxValue / scale + 0.5f);
}

参考

iPhone 4 视网膜

ppi:326

分辨率:640 x 960 像素

尺寸比例因子:未知

三星盖乐世 S

ppi:233

分辨率:480 x 800 像素

尺寸比例因子:1.5

三星 Galaxy Note

ppi:285

分辨率:800 x 1280 像素

尺寸比例因子:2.0

4

2 回答 2

1

您应该考虑几个观点。但我只是遵循一个简单的方法:

像素 -> 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;
}
于 2013-07-19T03:33:44.950 回答
0

假设 iPhone 4 Retina 版本的尺寸比例因子是 2.0(Android 中的 xhdpi),我做了一个非常简单的解决方法,只需使用 dp 单位给这些像素值的一半。所以 30px x 30px 按钮在 xml 文件中变成 15dp x 15dp。看起来不错,适用于 Google Nexus、三星 Galaxy S、S2、S4、Note、Note2。不使用 dp2px 和 px2dp 方法。

于 2013-07-19T06:38:56.173 回答