dp,sp,px的切换

1.计算屏幕密度

public static int px2dip(Context context,float pxValue){

    final float scale=context.getResources().getDisplayMetrics().density;

    return (int)(pxValue/scale+0.5f);

}

public static int dip2px(Context context,float dipValue){

    final float scale=context.getResources().getDisplayMetrics().density;

    return (int)(dipValue*scale+0.5f);

}

public static int px2sp(Context context,float pxValue){

    final float fontScale=context.getResources().getDisplayMetrics().scaledDensity;

    return (int)(pxValue/fontScale+0.5f);

}

public static int sp2px(Context context,float spValue){

    final float fontScale=context.getResources().getDisplayMetrics().scaledDensity;

    return (int)(spValue*fontScale+0.5f);

}


2.TypedValue

public static int dp2px(Context context,int dp){

 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,context.getResources().getDisplayMetrics());

}

public static int px2dp(Context context,int sp){

    return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,context.getResources().getDisplayMetrics());

}



其实  TypedValue.applyDimension也是用1的方式实现的:

/**

 * Converts an unpacked complex data value holding a dimension to its final floating 

 * point value. The two parameters unit and value

 * 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;

}


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容