版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!
前言
用於項目中dp、px、sp之間的轉換以及指定縮放值下的轉換。
效果圖
暫不需要
代碼分析
常用的方法是px2dip、dip2px;
px2dipRatio、dip2pxRatio方法的應用場景可以理解為一個占滿全屏的控件,要求等比例縮放顯示到占原屏幕0.95的容器中。此時,可以考慮 使用這兩個方法對這個控件的寬度和高度值進行等比例縮放。
使用步驟
一、項目組織結構圖

注意事項:
1、導入類文件后需要change包名以及重新import R文件路徑
2、Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋
二、導入步驟
將DensityUtil文件復制到項目中即可。
package com.why.project.densityutildemo.util; import android.content.Context; import android.util.DisplayMetrics; /** * Used 尺寸轉換工具類(全) */ public class DensityUtil { public static float RATIO = 0.95F;//縮放比例值 /** * px 轉 dp【按照一定的比例】*/ public static int px2dipRatio(Context context, float pxValue) { float scale = getScreenDendity(context) * RATIO; return (int)((pxValue / scale) + 0.5f); } /** * dp轉px【按照一定的比例】*/ public static int dip2pxRatio(Context context, float dpValue) { float scale = getScreenDendity(context) * RATIO; return (int)((dpValue * scale) + 0.5f); } /** * px 轉 dp * 48px - 16dp * 50px - 17dp*/ public static int px2dip(Context context, float pxValue) { float scale = getScreenDendity(context); return (int)((pxValue / scale) + 0.5f); } /** * dp轉px * 16dp - 48px * 17dp - 51px*/ public static int dip2px(Context context, float dpValue) { float scale = getScreenDendity(context); return (int)((dpValue * scale) + 0.5f); } /**獲取屏幕的寬度(像素)*/ public static int getScreenWidth(Context context) { return context.getResources().getDisplayMetrics().widthPixels;//1080 } /**獲取屏幕的寬度(dp)*/ public static int getScreenWidthDp(Context context) { float scale = getScreenDendity(context); return (int)(context.getResources().getDisplayMetrics().widthPixels / scale);//360 } /**獲取屏幕的高度(像素)*/ public static int getScreenHeight(Context context) { return context.getResources().getDisplayMetrics().heightPixels;//1776 } /**獲取屏幕的高度(像素)*/ public static int getScreenHeightDp(Context context) { float scale = getScreenDendity(context); return (int)(context.getResources().getDisplayMetrics().heightPixels / scale);//592 } /**屏幕密度比例*/ public static float getScreenDendity(Context context){ return context.getResources().getDisplayMetrics().density;//3 } /**獲取狀態欄的高度 72px * http://www.2cto.com/kf/201501/374049.html*/ public static int getStatusBarHeight(Context context) { int statusHeight = -1; try { Class<?> aClass = Class.forName("com.android.internal.R$dimen"); Object object = aClass.newInstance(); int height = Integer.parseInt(aClass.getField("status_bar_height").get(object).toString()); statusHeight = context.getResources().getDimensionPixelSize(height); } catch (Exception e) { e.printStackTrace(); } return statusHeight; //依賴於WMS(窗口管理服務的回調)【不建議使用】 /*Rect outRect = new Rect(); ((Activity)context).getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect); return outRect.top;*/ } /** * 指定機型(displayMetrics.xdpi)下dp轉px * 18dp - 50px*/ public static int dpToPx(Context context, int dp) { return Math.round(((float)dp * getPixelScaleFactor(context))); } /** * 指定機型(displayMetrics.xdpi)下px 轉 dp * 50px - 18dp*/ public static int pxToDp(Context context, int px) { return Math.round(((float)px / getPixelScaleFactor(context))); } /**獲取水平方向的dpi的密度比例值 * 2.7653186*/ public static float getPixelScaleFactor(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); return (displayMetrics.xdpi / 160.0f); } }
三、使用方法
package com.why.project.densityutildemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.why.project.densityutildemo.util.DensityUtil; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); } private void initData(){ /**====================================DensityUtil========================================*/ int screenWidth = DensityUtil.getScreenWidth(this); int screenHeight = DensityUtil.getScreenHeight(this); Log.w(TAG,"screenWidth="+screenWidth); Log.w(TAG,"screenHeight="+screenHeight); int dp = DensityUtil.px2dip(this,50); int px = DensityUtil.dip2px(this,dp); Log.w(TAG,"dp="+dp); Log.w(TAG,"px="+px); DensityUtil.RATIO = 0.95f; int dpRatio = DensityUtil.px2dipRatio(this,50); int pxRatio = DensityUtil.dip2pxRatio(this,dpRatio); Log.w(TAG,"dpRatio="+dpRatio); Log.w(TAG,"pxRatio="+pxRatio); int statusBarHeight = DensityUtil.getStatusBarHeight(this); Log.w(TAG,"barHeight="+statusBarHeight); } }
打印日志如下:

混淆配置
無
參考資料
Andorid獲取狀態欄高度
http://www.2cto.com/kf/201501/374049.html
