最近看了很多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...