绘制方格图,想动态控制格子的大小,这需要在代码中进行宽和高的设置。但是代码中直接设置数字50相当于是50px,那我想要为50dp怎么办,这时候就需要进行px和dp单位的换算了。为什么一定要设置单位为dp呢?是因为dp会在不同分辨率的手机上会有更好的适配效果,显示更加的正常。
知乎上关于这个问题的讨论与一些方案想法
很幸运,我点开这个链接后了解了许多关于dp和px的知识点。更棒的是有人直接给出了官方文档中关于这两者的换算关系。如下图:
文档中说是 px = dp * (dpi /160)
经过了解,上面的dpi/160其实就相当于不同手机分辨率手机的density的值。然后android的api中有能获取该值的方法,故问题得以解决。
package com.example.pc_2.myapplication.utils;
import android.content.Context;
/**
* Created by zouqi on 2017/12/20.
*/
public class DensityUtil {
/**
* 根据手机的分辨率将dp单位转成px(像素)
* @param context
* @param dpValue
* @return
*/
public static int dpConvertpx(Context context, float dpValue){
/**
手机显示的逻辑密度。这是独立像素密度单位的比例因子,在一个160dpi的手机屏上1DIP就是1pixel。
因此在160dpi的手机屏上该density的值为1;在120dpi的手机屏上该density值将会是0.75,以此类推。
根据真实的手机屏幕大小,该值还不是完全准确的,也就是说基于不同的手机分辨率,该density的值会有所变化,
进而能使换算的结果更加的精确。举个例子来说,在一个240*320分辨率的手机屏幕上,density的值为1(即屏幕大小是:1.5''*2'');
但是如果屏幕的分辨率是320*480,且屏幕大小需要维持为:1.5''*2'',那么这时候density的值将会改变(由1变为1.5)
*/
final float scale = context.getResources().getDisplayMetrics().density;
// 四舍五入,使换算结果更加的精确
return (int)(dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率将px(像素)单位转成dp
* @param context
* @param pxValue
* @return
*/
public static int pxConvertdp(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
}
上面的代码中给出了关键的注释,尤其是获取density的值,我特意查看了源码中对该值的解释并以注释的形式给出了。
================================================================