屏幕适配之dp和px之间的转换
屏幕适配:在java代码中设置的宽高都以像素px为单位,使得不同分辨率的手机宽高都不同
所以需要转化为dp为单位的值,这样在不同的分辨率下所表示的值都是相等的距离
public class DensityUtil { /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } }
/** * sp转px的方法。 */ public int sp2px(float spValue) { final float fontScale = getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); }
使用系统自带的api实现转换:
/** * dp转换为px */ public float dp2px(Context context , int dpVal){ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal,context.getResources().getDisplayMetrics()); } /** * sp转换为px(对于文本) */ public float sp2px(Context context ,int spVal){ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal,context.getResources().getDisplayMetrics()); }
工具类:
import android.app.Activity; import android.content.Context; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.view.Window; import android.view.WindowManager; /** * 尺寸相关工具类 * 1.dpi转px * 2.px转dp * 3.sp转px * 4.px转sp * 5.onCreate中强行获取View的宽高 * 6.获取屏幕的宽度px * 7.获取屏幕的高度px * 8.获取状态栏高度 * 9.获取状态栏高度+标题栏(ActionBar)高度 */ public class SizeUtil { //dpi转px public static float Dp2Px(Context context, float dpi) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpi, context.getResources().getDisplayMetrics()); } //px转dp public static float Px2Dp(Context context, float px) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px, context.getResources().getDisplayMetrics()); } //sp转px public static float Sp2Px(Context context, float sp) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics()); } //px转sp public static float Px2Sp(Context context, float px) { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px, context.getResources().getDisplayMetrics()); } //onCreate中强行获取View的宽高 public static int[] forceGetViewSize(View view) { int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); view.measure(widthMeasureSpec, heightMeasureSpec); return new int[]{widthMeasureSpec, heightMeasureSpec}; } //获取屏幕的宽度px public static int getDeviceWidth(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸 windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高 return outMetrics.widthPixels; } //获取屏幕的高度px public static int getDeviceHeight(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸 windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高 return outMetrics.heightPixels; } //获取状态栏高度 public int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } //获取状态栏高度+标题栏(ActionBar)高度 public static int getTopBarHeight(Activity activity) { return activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); } }