在Android开发中dp和px,sp和px之间的转换时必不可少的,网上流传的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class DisplayUtils { /** * convert px to its equivalent dp * 将px转换为与之相等的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转换为与之相等的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转换为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转换为px */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return ( int ) (spValue * fontScale + 0 .5f); } } |
关于转换公式中,通过类比一元一次函数,怎么看都是有问题的,这么明显的问题,为什么没人纠正,后来发现是自己并没有理解,原因是float类型在强转为int类型是,用的是去尾法,精度上有较大差异,所以通过+0.5f的方式,将去尾法转变成四舍五入法,提高精度。
调用TypedValue类实现转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/** * 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上,去尾法和四舍五入法的区别,即精度问题。
总结
以上所述是小编给大家介绍的android中px和dp,px和sp之间的转换方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://blog.csdn.net/Bing_ka/article/details/80745474