国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android原生系統API自帶dp、px、sp單位轉換

2019-11-06 09:41:12
字體:
來源:轉載
供稿:網友

Android系統中自帶的Api中可以使用TypedValue進行單位轉換

1,調用系統api轉換單位

// 獲得轉換后的px值float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 16,context.getResources().getDisplayMetrics());

2,分析TypedValue.applyDimension搞了什么事情?

// 在TypedValue類中/** * px、dp、sp、pt、in、mm單位轉換 * @param unit 轉換類型 * @param value 轉換值(float) * @param metrics 當前設備顯示密度 * @return 轉換單位后的值 */public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: // 轉換為px(像素)值 return value; case COMPLEX_UNIT_Dip: // 轉換為dp(密度)值 return value * metrics.density; case COMPLEX_UNIT_SP: // 轉換為sp(與刻度無關的像素)值 return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: // 轉換為pt(磅)值 return value * metrics.xdpi * (1.0f / 72); case COMPLEX_UNIT_IN: // 轉換為in(英寸)值 return value * metrics.xdpi; case COMPLEX_UNIT_MM: // 轉換為mm(毫米)值 return value * metrics.xdpi * (1.0f / 25.4f); } return 0;}

3,分析context.getResources().getDisplayMetrics()搞了什么事情

// 在Resource類中final DisplayMetrics mMetrics = new DisplayMetrics();// 構造方法,初始化了mMetricspublic Resources(AssetManager assets, DisplayMetrics metrics, Configuration config, CompatibilityInfo compatInfo) { mAssets = assets; mMetrics.setToDefaults(); if (compatInfo != null) { mCompatibilityInfo = compatInfo; } updateConfiguration(config, metrics); assets.ensureStringBlocks();}// 獲取密度值的方法public DisplayMetrics getDisplayMetrics() { if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels + "x" + mMetrics.heightPixels + " " + mMetrics.density); return mMetrics; }}// 在DisplayMetrics類中public void setToDefaults() { widthPixels = 0; heightPixels = 0; density = DENSITY_DEVICE / (float) DENSITY_DEFAULT; densityDpi = DENSITY_DEVICE; // 獲取密度值 scaledDensity = density; xdpi = DENSITY_DEVICE; ydpi = DENSITY_DEVICE; noncompatWidthPixels = widthPixels; noncompatHeightPixels = heightPixels; noncompatDensity = density; noncompatDensityDpi = densityDpi; noncompatScaledDensity = scaledDensity; noncompatXdpi = xdpi; noncompatYdpi = ydpi; }// 獲取密度值 public static int DENSITY_DEVICE = getDeviceDensity();PRivate static int getDeviceDensity() { return SystemProperties.getInt("qemu.sf.lcd_density", // 獲取當前系統的密度值 SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); // 沒有,則取默認值}// 獲取密度缺省值:160public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;public static final int DENSITY_MEDIUM = 160;

當然在實際編程中,我們一般都把單位轉換寫成工具類,通過工具類來調用:

/** * 根據手機分辨率從DP轉成PX * @param context * @param dpValue * @return */public static int dip2px(Context context, float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f);}/** * 將sp值轉換為px值,保證文字大小不變 * @param spValue * @return */public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f);}/** * 根據手機的分辨率PX(像素)轉成DP * @param context * @param pxValue * @return */public static int px2dip(Context context, float pxValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f);}/** * 將px值轉換為sp值,保證文字大小不變 * @param pxValue * @return */public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武汉市| 蚌埠市| 文水县| 凤翔县| 乐都县| 乌鲁木齐县| 太和县| 疏附县| 虎林市| 井研县| 和田县| 赣州市| 策勒县| 廉江市| 镇安县| 大庆市| 新民市| 怀远县| 泰宁县| 闸北区| 孝感市| 兰州市| 巴彦淖尔市| 鄢陵县| 家居| 德安县| 东方市| 杭锦后旗| 普宁市| 庆阳市| 元江| 卢湾区| 那坡县| 定安县| 高青县| 陇西县| 清河县| 商河县| 连州市| 神木县| 平乐县|