android 關於px轉換成dp,sp的結論

2021-08-20 04:34:08 字數 3839 閱讀 4239

最近看了很多px轉換dp,sp的貼子,看到了很多種方法

有通過安卓自帶的工具類反向推導得出的工具類

public class unitutils 

//轉換px為dip

public static int px2dp(context context, int px)

public static int sp2px(context context, float spvalue)

public static int px2sp(context context, float pxvalue)

}

也有通過ui設計的寬高畫素和螢幕尺寸,結合公式計算出來的

等等等等。。。。。。

最後通過測量控制項高度列印日誌,發現這些方法都不準確

可以這樣算:

1、找ui問出作圖時的寬和高的畫素

2、通過**獲取裝置的密度、dpi和寬   

displaymetrics metrics = this.getresources().getdisplaymetrics();

float density = metrics.density;            //螢幕密度

int dpi = metrics.densitydpi;                //螢幕dpi

int widthpixels = metrics.widthpixels;        //螢幕寬度

3、dp = (ui標的px / ui作圖的寬度)* 裝置的寬度 / 螢幕密度

舉個例子:    ui作圖時是以1024*768為準做的圖,我的裝置是1920*1200的,螢幕密度是2.25,dpi是360

ui標註圖里有個控制項寬高都是100px,那麼

100 / 768 * 1200 / 2.25 = 69.444

所以我就可以寫69.444 dp

但是!!!

如果換個裝置呢,換成2048*1536的,螢幕密度和dpi都換了,那69.444肯定就不合適了,改怎麼辦呢?不要急。。。

這就用到了最小螢幕寬度,最小螢幕寬度的單位是dp,那最小螢幕寬度怎麼計算呢?

最小螢幕寬度  dp = 160 * 螢幕寬度 / dpi
還拿我上面那個例子來看,我的裝置的最小螢幕寬度就是

160 * 1200 / 360 = 533.333 dp

所以我可以在res下面建個資料夾 values-sw533dp   或者  values-sw530dp,只要小於等於

算出來的最小螢幕寬度就行,為什麼要小於等於最小螢幕寬度呢?因為系統是從大到小。。。掃瞄吧。。如果建的資料夾是 values-sw550dp ,裝置的只有553.333,達不到550,就會自動進入小一級的,如果已經是最小的了就會用系統預設的values資料夾內的內容

建好資料夾後在下面建個dimen.xml的檔案,內容大致為

<?xml version="1.0" encoding="utf-8"?>

9.856sp

10.841sp

11.827sp

12.813sp

13.798sp

14.784sp

可以用我寫好的方法:
int width = 1200;//ui作圖的螢幕寬度

displaymetrics metrics = this.getresources().getdisplaymetrics();

float density = metrics.density; //裝置密度

int dpi = metrics.densitydpi; //裝置dpi

int widthpixels = metrics.widthpixels; //裝置寬度

stringbuilder stringbuilder = new stringbuilder();

for (int px = 0; px <= 200; px += 2)

}log.e("tag", stringbuilder.tostring());

列印出來結果是
<?xml version="1.0" encoding="utf-8"?>

0.0dp

0.888dp

1.777dp

2.666dp

3.555dp

4.444dp

5.333dp

6.222dp

7.111dp

8.0dp

8.888dp

9.777dp

10.666dp

11.555dp

12.444dp

13.333dp

14.222dp

15.111dp

16.0dp

16.888dp

17.777dp

18.666dp

19.555dp

20.444dp

21.333dp

22.222dp

23.111dp

24.0dp

24.888dp

25.777dp

26.666dp

27.555dp

28.444dp

29.333dp

30.222dp

31.111dp

32.0dp

32.888dp

33.777dp

34.666dp

35.555dp

36.444dp

37.333dp

38.222dp

39.111dp

40.0dp

40.888dp

41.777dp

42.666dp

43.555dp

44.444dp

45.333dp

46.222dp

47.111dp

48.0dp

48.888dp

49.777dp

50.666dp

51.555dp

52.444dp

53.333dp

54.222dp

55.111dp

56.0dp

56.888dp

57.777dp

58.666dp

59.555dp

60.444dp

61.333dp

62.222dp

63.111dp

64.0dp

64.888dp

65.777dp

66.666dp

67.555dp

68.444dp

69.333dp

70.222dp

71.111dp

72.0dp

72.888dp

73.777dp

74.666dp

75.555dp

76.444dp

77.333dp

78.222dp

79.111dp

80.0dp

80.888dp

81.777dp

82.666dp

83.555dp

84.444dp

85.333dp

86.222dp

87.111dp

88.0dp

88.888dp

到這裡解決了px轉換為dp的問題了,px轉換為sp和這個方法一樣,只是把dp改為sp就行了

做不同螢幕的適配就需要知道那個螢幕的寬度、螢幕密度、螢幕dpi,然後套用這個方法就行了。

關於遞迴轉換成迴圈的思想

今天在看python的課程時 聽到老師講到了遞迴 實際上 在我大學學程式設計課的時候 就聽到老師們說過 遞迴不是一種很好定義函式邏輯的方式 這是因為在遞迴過程中 程式為了儲存函式現場的變數需要使用大量的記憶體資源 尤其是當遞迴的層數變多時 就會占用大量的記憶體 於是 使用迴圈方式來解決遞迴問題是一種...

MFC中關於char 轉換成LPCWSTR的問題

在寫win32應用程式時候,你可能遭遇到如下錯誤 error c2664 loadimagew cannot convert parameter 2 from char 20 to lpcwstr char 20 轉換為 lpcwstr 一 問題的原因 vs2010預設採用寬字元unicode編碼方...

android 字串轉換成JSON物件

public class jsonhelper return jsonobject catch jsonexception e summary 獲取json 物件的陣列 param jsonstring json格式的字串 return 返回json 物件的陣列 public static sync...