android中px和dp,px和sp之間的轉(zhuǎn)換方法
在Android開發(fā)中dp和px,sp和px之間的轉(zhuǎn)換時必不可少的,網(wǎng)上流傳的方法
public class DisplayUtils { /** * convert px to its equivalent dp * 將px轉(zhuǎn)換為與之相等的dp */ public static int px2dp(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * convert dp to its equivalent px * 將dp轉(zhuǎn)換為與之相等的px */ public static int dp2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } /** * convert px to its equivalent sp * 將px轉(zhuǎn)換為sp */ public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * convert sp to its equivalent px * 將sp轉(zhuǎn)換為px */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } }
關(guān)于轉(zhuǎn)換公式中,通過類比一元一次函數(shù),怎么看都是有問題的,這么明顯的問題,為什么沒人糾正,后來發(fā)現(xiàn)是自己并沒有理解,原因是float類型在強轉(zhuǎn)為int類型是,用的是去尾法,精度上有較大差異,所以通過+0.5f的方式,將去尾法轉(zhuǎn)變成四舍五入法,提高精度。
調(diào)用TypedValue類實現(xiàn)轉(zhuǎn)換
/** * convert dp to its equivalent px */ protected int dp2px(int dp){ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,getResources().getDisplayMetrics()); } /** * convert sp to its equivalent px */ protected int sp2px(int sp){ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,getResources().getDisplayMetrics()); } public class TypedValue { ... /** {@link #TYPE_DIMENSION} complex unit: Value is raw pixels. */ public static final int COMPLEX_UNIT_PX = 0; /** {@link #TYPE_DIMENSION} complex unit: Value is Device Independent * Pixels. */ public static final int COMPLEX_UNIT_DIP = 1; /** {@link #TYPE_DIMENSION} complex unit: Value is a scaled pixel. */ public static final int COMPLEX_UNIT_SP = 2; /** {@link #TYPE_DIMENSION} complex unit: Value is in points. */ public static final int COMPLEX_UNIT_PT = 3; /** {@link #TYPE_DIMENSION} complex unit: Value is in inches. */ public static final int COMPLEX_UNIT_IN = 4; /** {@link #TYPE_DIMENSION} complex unit: Value is in millimeters. */ public static final int COMPLEX_UNIT_MM = 5; /** * Converts an unpacked complex data value holding a dimension to its final floating * point value. The two parameters <var>unit</var> and <var>value</var> * are as in {@link #TYPE_DIMENSION}. * * @param unit The unit to convert from. * @param value The value to apply the unit to. * @param metrics Current display metrics to use in the conversion -- * supplies display density and scaling information. * * @return The complex floating point value multiplied by the appropriate * metrics depending on its unit. */ public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; } ... }
對比兩種方式的差異,其實就在+0.5f上,去尾法和四舍五入法的區(qū)別,即精度問題。
總結(jié)
以上所述是小編給大家介紹的android中px和dp,px和sp之間的轉(zhuǎn)換方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android 中IntentFilter的匹配規(guī)則實例詳解
這篇文章主要介紹了Android 中IntentFilter的匹配規(guī)則實例詳解的相關(guān)資料,希望通過本文大家能了解掌握IntentFilter的匹配規(guī)則問題,需要的朋友可以參考下2017-09-09Android實現(xiàn)帶動畫效果的可點擊展開TextView
這篇文章主要為大家詳細介紹了Android實現(xiàn)帶動畫效果的可點擊展開TextView,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07Android項目類似淘寶 電商 搜索功能,監(jiān)聽軟鍵盤搜索事件,延遲自動搜索,以及時間排序的搜索歷史記錄的實現(xiàn)
本篇文章主要介紹了Android實現(xiàn)類似淘寶、電商、搜索功能(監(jiān)聽軟鍵盤搜索事件,延遲自動搜索,以及時間排序的搜索歷史記錄),感興趣的小伙伴們可以參考一下。2016-10-10Android學習筆記之ActionBar Item用法分析
這篇文章主要介紹了Android學習筆記之ActionBar Item用法,結(jié)合實例形式分析了ActionBar Item的具體功能與相關(guān)使用技巧,需要的朋友可以參考下2017-05-05