1. 程式人生 > >程式碼實現px與dp的單位換算

程式碼實現px與dp的單位換算

背景

繪製方格圖,想動態控制格子的大小,這需要在程式碼中進行寬和高的設定。但是程式碼中直接設定數字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的值,我特意查看了原始碼中對該值的解釋並以註釋的形式給出了

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

A little bit of progress every day!Come on!