android 尺寸適配相關
Android上常見度量單位
px(像素):屏幕上的點,絕對長度,與硬件相關。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸,point。
dp(與密度無關的像素):一種基於屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:Density-independent pixel,同dp相同。
sp:在dp的基礎上,還與比例無關,個人理解為是一個矢量圖形單位。
在xml中定義大小,建議TextView使用sp,其他使用dp
係統定義了四種像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi)
設備獨立像素轉換成屏幕實際像素的換算很簡單:px
= dp * (dpi/ 160). pixls=160*(320/160)
ImageView中XML屬性src和background的區別:
background會根據ImageView組件給定的長寬進行拉伸,而src就存放的是原圖的大小,不會進行拉伸。src是圖片內容(前景),bg是背景,可以同時使用。
此外:scaleType隻對src起作用
Android資源文件
drawable-hdpi裏麵存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi裏麵存放中等分辨率的圖片,如HVGA (320x480)
drawable-ldpi裏麵存放低分辨率的圖片,如QVGA (240x320)
Android手機屏幕標準 對應圖標尺寸標準 屏幕密度
xhdpi 1280*720 96*96 320
hdpi 480*800 72*72 240
mdpi 480*320 48*48 160
ldpi 320*240 36*36 120
以480dip*800dip的WVGA(density=240)為例,詳細列出不同density下屏幕分辨率信息:
當density=120時 屏幕實際分辨率為240px*400px (兩個點對應一個分辨率)
狀態欄和標題欄高各19px或者25dip
橫屏是屏幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時屏幕寬度240px或者480dip,工作區域高度381px或者775dip
density=160時 屏幕實際分辨率為320px*533px (3個點對應兩個分辨率)
狀態欄和標題欄高個25px或者25dip
橫屏是屏幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時屏幕寬度320px或者480dip,工作區域高度508px或者775dip
density=240時 屏幕實際分辨率為480px*800px (一個點對於一個分辨率)
狀態欄和標題欄高個38px或者25dip
橫屏是屏幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時屏幕寬度480px或者480dip,工作區域高度762px或者775dip
如何計算密度(dpi)
1.標準是240*320畫在1.5*2平方inch上。那麼像每平方英寸有240*320/(1.5*2)=25600點,也就是一平方英寸的像素點為25600,所以dpi取為它的平方根160;如果你的dpi是120,那麼它的密度就是0.75.
2. 密度不隻是與width有關,還與height有關,所以不管width是1.8還是1.3,它的密度都有可能是1;比如width是1.8,隻要它的 height是3/1.8的話,如果pixel為240*320的話,它的密度仍舊是1;同樣如果width為1.3,隻要它的 height為3/1.3的話,像素點為240*320,則密度也是1.
3.320*480/(1.5*2)得到單位平方英寸的點為51200,所以單位平方英寸是240*320畫在1.5*2屏幕的2倍。但是這是平方英寸啊,算密度的時候要開平方的啊,所以應該是2開平方,是1.414吧,大致密度為1.5。
px與dip的關係
Android中,在160dpi (mdpi)中, 1 dip= 1 px;
以此類推,在120dpi(ldpi)中, 1 dip = 0.75px;
在240dpi (hdpi)中, 1 dip = 1.5px;
在320dpi(xhdpi)中, 1dip = 2px;
如何做到與密度無關
如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏 幕密度變成了320。那麼原來TextView的寬度設成160px,在密度為320的3.2 寸屏幕裏看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。係統會自動將width屬性值設置成320px的。 也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,係統會根據屏幕密度的變化自動進行轉換。官方文檔總結的計算公式為:pixels = dps * (density /160).
使用dip作為View的單位,這樣就可以同時兼容各種不同的分辨率,不會造成UI的不可兼容。
優化的兩種方式:
import android.content.Context; import android.util.DisplayMetrics; /** * 計算公式 pixels = dips * (density / 160) * * @version 1.0.1 2010-12-11 * * @author */ public class DensityUtil { private static final String TAG = DensityUtil.class.getSimpleName(); // 當前屏幕的densityDpi private static float dmDensityDpi = 0.0f; private static DisplayMetrics dm; private static float scale = 0.0f; /** * * 根據構造函數獲得當前手機的屏幕係數 * * */ public DensityUtil(Context context) { // 獲取當前屏幕 dm = new DisplayMetrics(); dm = context.getApplicationContext().getResources().getDisplayMetrics(); // 設置DensityDpi setDmDensityDpi(dm.densityDpi); // 密度因子 scale = getDmDensityDpi() / 160; Logger.i(TAG, toString()); } /** * 當前屏幕的density因子 * * @param DmDensity * @retrun DmDensity Getter * */ public static float getDmDensityDpi() { return dmDensityDpi; } /** * 當前屏幕的density因子 * * @param DmDensity * @retrun DmDensity Setter * */ public static void setDmDensityDpi(float dmDensityDpi) { DensityUtil.dmDensityDpi = dmDensityDpi; } /** * 密度轉換像素 * */ public static int dip2px(float dipValue) { return (int) (dipValue * scale + 0.5f); } /** * 像素轉換密度 * */ public int px2dip(float pxValue) { return (int) (pxValue / scale + 0.5f); } @Override public String toString() { return " dmDensityDpi:" + dmDensityDpi; } }
<manifest xmlns:andro> ... <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> ... </manifest>
參考https://blog.csdn.net/liguangzhenghi/article/details/7244271
https://www.oschina.net/question/234345_40079
https://uoloveruo.blog.163.com/blog/static/283311422011102304132611/
https://blog.csdn.net/xixinyan/article/details/7316313
https://download.csdn.net/detail/welovesunflower/4540688
https://www.360doc.com/content/12/0301/17/5087210_190881395.shtml
使用Memory
Analyzer tool(MAT)分析內存泄漏(二)
https://www.blogjava.net/rosen/archive/2010/06/13/323522.html
MAT來分析,前提是Android開發和測試的工具安裝完整,SDK,Eclipse:
1.打開Eclipse
2.選擇 Help->Install New Software;
3.在Work with中添加站點:https://download.eclipse.org/mat/1.4/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到:https://www.eclipse.org/mat/downloads.php )
4.生成.hprof文件:插入SD卡(Android機器很多程序都需要插入SD卡),並將設備連接到PC,在Eclipse中的DDMS中選擇要測試的進程,然後點擊Update Heap 和Dump HPROF file兩個Button。
.hprof 文件會自動保存在SD卡上,把 .hprof 文件拷貝到PC上的\ android-sdk-windows\tools目錄下。這個由DDMS生成的文件不能直接在MAT打開,需要轉換。
運行cmd打開命令行,cd到\ android-sdk-windows\tools所在目錄,並輸入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof為原始文件,yyyyy.hprof為轉換過後的文件。轉換過後的文件自動放在android-sdk-windows\tools 目錄下。
OK,到此為止,.hprof文件處理完畢,可以用來分析內存泄露情況了。
5.打開MAT:
在Eclipse中點擊Windows->Open Perspective->Other->Memory Analysis
6.導入.hprof文件
在MAT中點擊 File->Open File,瀏覽到剛剛轉換而得到的.hprof文件,並Cancel掉自動生成報告,點擊Dominator Tree,並按Package分組,選擇自己所定義的Package 類點右鍵,在彈出菜單中選擇List objects->With incoming references。
這時會列出所有可疑類,右鍵點擊某一項,並選擇Path to GC Roots->exclude weak/soft references,會進一步篩選出跟程序相關的所有有內存泄露的類。據此,可以追蹤到代碼中的某一個產生泄露的類。
Memory Analyzer 1.4.0 Release
-
Version: 1.4.0.20140604 | Date: 25 June 2014 | Type:
Released
- Update Site: https://download.eclipse.org/mat/1.4/update-site/
- Archived Update Site: MemoryAnalyzer-1.4.0.201406041413.zip (12 MB)
-
Stand-alone Eclipse RCP Applications
Windows (x86) (52.4 MB)
Windows (x86_64) (52.4 MB)
Mac OSX (Mac/Cocoa x86) (52.0 MB)
Mac OSX (Mac/Cocoa x86_64) (51.8 MB)
Linux (x86/GTK 2) (52.3 MB)
Linux (x86_64/GTK 2) (52.4 MB)
Linux (PPC/GTK 2) (52.0 MB)
Linux (PPC64/GTK 2) (52.0 MB)
Linux (s390/GTK 2) (52.0 MB)
Linux (s390x/GTK 2) (52.0 MB)
Solaris 8 (x86/GTK 2) (51.8 MB)
Solaris 8 (SPARC/GTK 2) (51.9 MB)
HP-UX (IA64/GTK 2) (51.9 MB)
AIX (PPC/GTK 2) (52.4 MB)
AIX (PPC64/GTK 2) (52.5 MB)
最後更新:2017-04-03 05:40:13
上一篇:
Intel MIC架構下COI框架介紹
下一篇:
[.net] 不明確引用
張誌宇 SERVELET JSP學習講義-知識點總結綱要
Mybatis中傳參包There is no getter for property named 'XXX' in 'class java.lang.String'
Java正則表達式(二)、常用正則工具類
AI大發展,醫療領域AI應用離我們還有多遠?
JVM實用參數(七)CMS收集器
Android基於TranslateAnimation的動畫動態菜單
當前時間的中文顯示
專訪 | 特立獨行的Voyage,要讓每輛自動駕駛出租車盈利
tomcat:一台機器上同時啟動兩個tomcat的注意點
物聯網技術在農業領域的應用