編輯:Android資訊
dpi是“dot per inch”的縮寫,每英寸像素數。
四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)
一般情況下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。
DPI=對角線的像素值/尺寸
手機屏幕分辨率和屏幕密度是兩碼事!並不是800*480的分辨率手機圖片就應該放在hdpi文件夾中。5.0英寸 800*480屬於mdpi
也可以通過代碼獲取:
DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 屏幕寬度(像素) int height = metric.heightPixels; // 屏幕高度(像素) float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5) int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
android會根據屏幕本身的尺寸與密度特性,自動載入對應的資源,並把它們從邏輯像素(DIP,用於定義界面布局)轉換成屏幕上的物理像素。
首先看看 系統是如何通過Resources的getDrawable(int id)方法找圖片的
public Drawable getDrawable(int id) throws NotFoundException { TypedValue value; synchronized (mAccessLock) { value = mTmpValue; if (value == null) { value = new TypedValue(); } else { mTmpValue = null; } getValue(id, value, true); } Drawable res = loadDrawable(value, id); synchronized (mAccessLock) { if (mTmpValue == null) { mTmpValue = value; } } return res; }
TypedValue 我們可以理解為存儲數據的類型,主要被Resouces使用於持有的資源值
通過getValue(id,value,true)方法去得到該id的資源的屬性
public void getValue(int id, TypedValue outValue, boolean resolveRefs) throws NotFoundException { boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs); if (found) { return; } throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)); }
最後通過loadDrawable(value, id)得到drawable,該方法到了底層的C代碼,大致意思就是通過TypedValue中的方法和屬性就可以獲得我們想要的屬性值,然後加載圖片
OK,下面來做個實驗.
試驗一: 手機是1280*720 4.3英寸 屬於xdpi 圖片分辨率為960*640 (按正常圖片不縮放 圖片放在手機裡面 應該不會充滿 整個手機) 我把圖片放在不
文件夾 加載時間(ms) 圖片顯示 說明
drawable 311 充滿屏幕 圖片有拉伸
drawable-nodpi 130 未充滿屏幕 圖片顯示正常
drawable-ldpi 442 充滿屏幕 圖片有拉伸
drawable-mdpi 383 充滿屏幕 圖片有拉伸
drawable-hdpi 226 充滿屏幕 圖片有拉伸
drawable-xhdpi 109 未充滿屏幕 圖片顯示正常
試驗二: 手機是800*480 4.3英寸 屬於hdpi 圖片分辨率為960*640 (按正常圖片不縮放 圖片放在手機裡面 應該充滿 整個手機) 我把圖片放在不同drawable文件夾中
文件夾 加載時間(ms) 圖片顯示 說明
drawable 290 充滿屏幕 圖片拉伸
drawable-nodpi 127 充滿屏幕 圖片顯示正常
drawable-ldpi 369 充滿屏幕 圖片拉伸
drawable-mdpi 346 充滿屏幕 圖片拉伸
drawable-hdpi 124 充滿屏幕 圖片顯示正常
drawable-xhdpi 241 未充滿屏幕 圖片縮放
drawable-nodpi 中 圖片不會被拉伸
系統在得到圖片時候,會先到設備對應的dpi的文件夾下去去找資源文件,找到後應該不會做縮放直接返回圖片。
如果沒有在對應的dpi文件夾中找到,回去其他文件夾中查找,找到後會做相應的縮放。
在高dpi找到的圖片會縮放,在低dpi的會拉伸
還有就是 源碼中可以看出 loadDrawable的過程實在C層做的。通過系統資源id加載會比java層直接加載圖片更便捷。
運行時權限介紹 Android 6.0在我們原有的AndroidManifest.xml聲明權限的基礎上,又新增了運行時權限動態檢測,以下權限都需要在運行時判斷:
快捷方式 應該來說 很多人都做過,我們就來看一下基本的快捷方式 是怎麼實現的,會有什麼問題? 首先 肯定要獲取權限: <!-- 添加快捷方式 -->
當在某個網站注冊賬號的時候,網站會讓我們提供性別,生日,城市等信息,為了方便,就提供了一個下拉列表供我們選擇,在Android也同樣有這樣的功能,這就是Spinn
隨著現在社交網絡的日益繁多,眾多的社交客戶端已占據了人們的大量時間,所以在我們的應用中具有一鍵分享的功能對提高我們產品的知名度有很大的幫助。新浪微博、騰訊微博、騰