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之间的转换方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!