代码实现px与dp的单位换算

  • 背景
  • 看看别人的思路
  • 整合自己查看的资料并完成换算
    • A little bit of progress every dayCome on

背景

绘制方格图,想动态控制格子的大小,这需要在代码中进行宽和高的设置。但是代码中直接设置数字50相当于是50px,那我想要为50dp怎么办,这时候就需要进行px和dp单位的换算了。为什么一定要设置单位为dp呢?是因为dp会在不同分辨率的手机上会有更好的适配效果,显示更加的正常。


看看别人的思路

知乎上关于这个问题的讨论与一些方案想法

很幸运,我点开这个链接后了解了许多关于dp和px的知识点。更棒的是有人直接给出了官方文档中关于这两者的换算关系。如下图:

代码实现px与dp的单位换算_第1张图片

文档中说是 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的值,我特意查看了源码中对该值的解释并以注释的形式给出了

================================================================

A little bit of progress every day!Come on!

你可能感兴趣的:(安卓开发技术学习)