程式碼實現px與dp的單位換算
阿新 • • 發佈:2019-01-26
背景
繪製方格圖,想動態控制格子的大小,這需要在程式碼中進行寬和高的設定。但是程式碼中直接設定數字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的值,我特意查看了原始碼中對該值的解釋並以註釋的形式給出了。
================================================================