
【来源】ExMobi 二次开发手册
手机屏幕根据密度范围分为五种:低、中、高、超高、超超高,为了确保界面元素在不同的屏幕都能合适的展示,在设计界面元素的 UI 时,UI 工程师建议统一采用 dpi (Dots Per Inch) 来定义界面元素。
计算手机dpi,需要知道手机屏幕尺寸和手机分辨率。即
手机分辨率 | 屏幕尺寸(Inch) | 实际 DPI | 分屏 | DPI 值 |
480 x 800 | 4 英寸 | 233 | 高分屏 [188,300) | 240 |
480 x 854 | 3.7 英寸 | 265 | 高分屏 [188,300) | 240 |
1024 x 768 | 9.7 英寸 | 132 | 中分屏 [121,188) | 160 |
320 x 480 | 3.5 英寸 | 165 | 中分屏 [121,188) | 160 |
640 x 960 | 3.5 英寸 | 330 | 超高分屏 [300,420) | 320 |
1920 x 1080 | 5 英寸 | 440 | 超超高分屏 [420, ) | 480 |
【示例】
三星 i9000,屏幕尺寸 4 英寸,分辨率 480 * 800。套入公式
计算结果取近似值 233,即三星 i9000 的 dpi 为 233。介于高分屏区间 [188,300],所以取 240.
在实际设计中,UI 度量单位以 640*960 设计图为基准,测量实际尺寸除以 2。现在以 720*1280 设计图为基准。
/**
* 获得屏幕相对的宽度和高度<br />
* 横屏时候宽度大于高度,竖屏时候高度大于宽度
*
* param windowManager
* return <br />
* point.x:宽度,point.y:高度
*/
@SuppressLint("NewApi")
public static Point getScreenSize(WindowManager windowManager) {
Point point = new Point(0, 0);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
point.x = windowManager.getDefaultDisplay().getWidth();
point.y = windowManager.getDefaultDisplay().getHeight();
} else {
windowManager.getDefaultDisplay().getSize(point);
} return point;
}
获得屏幕的宽度和密度
public static int getScreenWidth(Context context) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
return display.getWidth(); } public static float getScreeDensity(Context context){
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metric = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metric); float density = metric.density; // 密度(0.75 / 1.0 / 1.5 / 2.0)
//int densityDpi = metric.densityDpi;
return density;
}
根据屏幕大小调整尺寸
// 根据屏幕和图片大小调整显示尺寸
int justShowViewHeight = mScreenSize.x * 150 / 640;
LayoutParams justShowParams = mJustShowImg.getLayoutParams();
justShowParams.height = justShowViewHeight;
mJustShowImg.setLayoutParams(justShowParams);
Picasso.with(mActivity).load(R.drawable.fragment_main_justshow).into(mJustShowImg);