android中px和dp,px和sp之间的转换方法
在Android开发中dp和px,sp和px之间的转换时必不可少的,网上流传的方法
publicclassDisplayUtils{ /** *convertpxtoitsequivalentdp *将px转换为与之相等的dp */ publicstaticintpx2dp(Contextcontext,floatpxValue){ finalfloatscale=context.getResources().getDisplayMetrics().density; return(int)(pxValue/scale+0.5f); } /** *convertdptoitsequivalentpx *将dp转换为与之相等的px */ publicstaticintdp2px(Contextcontext,floatdipValue){ finalfloatscale=context.getResources().getDisplayMetrics().density; return(int)(dipValue*scale+0.5f); } /** *convertpxtoitsequivalentsp *将px转换为sp */ publicstaticintpx2sp(Contextcontext,floatpxValue){ finalfloatfontScale=context.getResources().getDisplayMetrics().scaledDensity; return(int)(pxValue/fontScale+0.5f); } /** *convertsptoitsequivalentpx *将sp转换为px */ publicstaticintsp2px(Contextcontext,floatspValue){ finalfloatfontScale=context.getResources().getDisplayMetrics().scaledDensity; return(int)(spValue*fontScale+0.5f); } }
关于转换公式中,通过类比一元一次函数,怎么看都是有问题的,这么明显的问题,为什么没人纠正,后来发现是自己并没有理解,原因是float类型在强转为int类型是,用的是去尾法,精度上有较大差异,所以通过+0.5f的方式,将去尾法转变成四舍五入法,提高精度。
调用TypedValue类实现转换
/** *convertdptoitsequivalentpx */ protectedintdp2px(intdp){ return(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,getResources().getDisplayMetrics()); } /** *convertsptoitsequivalentpx */ protectedintsp2px(intsp){ return(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,getResources().getDisplayMetrics()); } publicclassTypedValue{ ... /**{@link#TYPE_DIMENSION}complexunit:Valueisrawpixels.*/ publicstaticfinalintCOMPLEX_UNIT_PX=0; /**{@link#TYPE_DIMENSION}complexunit:ValueisDeviceIndependent *Pixels.*/ publicstaticfinalintCOMPLEX_UNIT_DIP=1; /**{@link#TYPE_DIMENSION}complexunit:Valueisascaledpixel.*/ publicstaticfinalintCOMPLEX_UNIT_SP=2; /**{@link#TYPE_DIMENSION}complexunit:Valueisinpoints.*/ publicstaticfinalintCOMPLEX_UNIT_PT=3; /**{@link#TYPE_DIMENSION}complexunit:Valueisininches.*/ publicstaticfinalintCOMPLEX_UNIT_IN=4; /**{@link#TYPE_DIMENSION}complexunit:Valueisinmillimeters.*/ publicstaticfinalintCOMPLEX_UNIT_MM=5; /** *Convertsanunpackedcomplexdatavalueholdingadimensiontoitsfinalfloating *pointvalue.Thetwoparametersunitandvalue *areasin{@link#TYPE_DIMENSION}. * *@paramunitTheunittoconvertfrom. *@paramvalueThevaluetoapplytheunitto. *@parammetricsCurrentdisplaymetricstouseintheconversion-- *suppliesdisplaydensityandscalinginformation. * *@returnThecomplexfloatingpointvaluemultipliedbytheappropriate *metricsdependingonitsunit. */ publicstaticfloatapplyDimension(intunit,floatvalue, DisplayMetricsmetrics) { switch(unit){ caseCOMPLEX_UNIT_PX: returnvalue; caseCOMPLEX_UNIT_DIP: returnvalue*metrics.density; caseCOMPLEX_UNIT_SP: returnvalue*metrics.scaledDensity; caseCOMPLEX_UNIT_PT: returnvalue*metrics.xdpi*(1.0f/72); caseCOMPLEX_UNIT_IN: returnvalue*metrics.xdpi; caseCOMPLEX_UNIT_MM: returnvalue*metrics.xdpi*(1.0f/25.4f); } return0; } ... }
对比两种方式的差异,其实就在+0.5f上,去尾法和四舍五入法的区别,即精度问题。
总结
以上所述是小编给大家介绍的android中px和dp,px和sp之间的转换方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!