1. 程式人生 > >Android hdpi、nodpi、sw600dp-xhdpi、sw720dp-xhdpi、xhdpi

Android hdpi、nodpi、sw600dp-xhdpi、sw720dp-xhdpi、xhdpi

術語和概念 
螢幕尺寸 
螢幕的物理尺寸,以螢幕的對角線長度作為依據(比如 2.8寸, 3.5寸)。 
簡而言之, Android把所有的螢幕尺寸簡化為三大類:大,正常,和小。 
程式可以針對這三種尺寸的螢幕提供三種不同的佈局方案,然後系統會負責把你的佈局方案以合適的方式渲染到對應的螢幕上,這個過程是不需要程式設計師用程式碼來干預的。

螢幕長寬比 
螢幕的物理長度與物理寬度的比例。程式可以為制定長寬比的螢幕提供製定的素材,只需要用系統提供的資源分類符long和 notlong。

解析度 
螢幕上擁有的畫素的總數。注意,雖然大部分情況下解析度都被表示為“寬度×長度”,但解析度並不意味著螢幕長寬比。在 Android系統中,程式一般並不直接處理解析度。

密度 
以螢幕解析度為基礎,沿螢幕長寬方向排列的畫素。 
密度較低的螢幕,在長和寬方向都只有比較少的畫素,而高密度的螢幕通常則會有很多 ——甚至會非常非常多——畫素排列在同一區域。螢幕的密度是非常重要的,舉個例子,長寬以畫素為單位定義的介面元素(比如一個按鈕),在低密度的螢幕上會 顯得很大,但在高密度的螢幕上則會顯得很小。

密度無關的畫素( DIP ) 
指一個抽象意義上的畫素,程式用它來定義介面元素。它作為一個與實際密度無關的單位,幫助程式設計師構建一個佈局方案(介面元素的寬度,高度,位置)。 
一個與密度無關的畫素,在邏輯尺寸上,與一個位於畫素密度為 160DPI的螢幕上的畫素是一致的,這也是Android平臺所假定的預設顯示裝置。在執行的時候,平臺會以目標螢幕的密度作為基準,“透明地”處理所 有需要的DIP縮放操作。要把密度無關畫素轉換為螢幕畫素,可以用這樣一個簡單的公式: pixels = dips * (density / 160)。舉個例子,在 DPI為 240的螢幕上, 1個 DIP等於 1.5個物理畫素。我們強烈推薦你用 DIP來定義你程式的介面佈局,因為這樣可以保證你的 UI在各種解析度的螢幕上都可以正常顯示。

為了簡化程式設計師面在對各種解析度時的困擾,也為了具備各種解析度的平臺都可以直接執行這些程式, Android平臺將所有的螢幕以密度和解析度為分類方式,各自分成了三類: 
·三種主要的尺寸:大,正常,小; 
·三種不同的密度:高( hdpi),中( mdpi)和低( ldpi)。 
【DPI是“dot per inch”的縮寫,每英寸畫素數。】
如果需要的話,程式可以為各種尺寸的螢幕提供不同的資源(主要是佈局),也可以為 各種密度的螢幕提供不同的資源(主要是點陣圖)。除此以外,程式不需要針對螢幕的尺寸或者密度作出任何額外的處理。在執行的時候,平臺會根據螢幕本身的尺寸 與密度特性,自動載入對應的資源,並把它們從邏輯畫素( DIP,用於定義介面佈局)轉換成螢幕上的物理畫素。

轉自 http://www.cnblogs.com/cmduan/archive/2012/03/09/2388345.html

首先是幾個基本概念:

1.螢幕尺寸Screen size

即顯示螢幕的實際大小,按照螢幕的對角線進行測量。

為簡單起見,Android把所有的螢幕大小分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).

應用程式可以為這四種尺寸分別提供不同的自定義屏幕布局-平臺將根據螢幕實際尺寸選擇對應佈局進行渲染,這種選擇對於程式側是透明的。

2.螢幕長寬比Aspect ratio

長寬比是螢幕的物理寬度與物理高度的比例關係。應用程式可以通過使用限定的資源來為指定的長寬比提供屏幕布局資源。

3.螢幕解析度Resolution

在螢幕上顯示的物理畫素總和。需要注意的是:儘管解析度通常用寬x高表示,但解析度並不意味著具體的螢幕長寬比。

在Andorid系統中,應用程式不直接使用解析度。

4.密度Density

根據畫素解析度,在螢幕指定物理寬高範圍內能顯示的畫素數量。

在同樣的寬高區域,低密度的顯示屏能顯示的畫素較少,而高密度的顯示屏則能顯示更多的畫素。

螢幕密度非常重要,因為其它條件不變的情況下,一共寬高固定的UI元件(比如一個按鈕)在在低密度的顯示屏上顯得很大, 而在高密度顯示屏上看起來就很小。

為簡單起見,Android把所有的螢幕解析度也分為四種尺寸:小,普通,大,超大(分別對應:small, normal, large, and extra large).

應用程式可以為這四種尺寸分別提供不同的資源-平臺將透明的對資源進行縮放以適配指定的螢幕解析度。

5.裝置獨立畫素Density-independent pixel (dp)

應用程式可以用來定義UI元件的虛擬畫素單元,通過密度無關的方式來描述佈局尺寸和位置。

一個裝置獨立畫素相當於一個160 dpi螢幕上的物理畫素。

在程式執行時,系統根據螢幕的實際密度透明的處理任何需要縮放的裝置獨立畫素單元,裝置獨立畫素轉換成螢幕實際畫素的換算很簡單:pixels = dps * (density / 160).

例如在240 dpi的螢幕上,1個裝置獨立畫素等於1.5物理畫素.為確保UI元件在不同的螢幕都能合適的展示,強烈建議使用裝置獨立畫素單元來定義你的應用程式UI。

四種螢幕尺寸分類:: small, normal, large, and xlarge

四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)

需要注意的是: xhdpi是從  Android   2.2 (API Level 8)才開始增加的分類.

xlarge是從Android 2.3 (API Level 9)才開始增加的分類.

DPI是“dot per inch”的縮寫,每英寸畫素數。

一般情況下的普通螢幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

兩種獲取螢幕解析度資訊的方法:

DisplayMetrics metrics = new DisplayMetrics();

Display display = activity.getWindowManager().getDefaultDisplay();

display.getMetrics(metrics);

//這裡得到的畫素值是裝置獨立畫素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 這樣獲得的引數資訊不正確,不要使用這種方式。

不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。這個得到的寬和高是空的。

複製程式碼
    private void initResolutionStr(Context context) {
        if (ApiConfig.getResolutionStr() == null || ApiConfig.getResolutionStr().equals("")) {
            WindowManager winMgr = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
            Display display = winMgr.getDefaultDisplay();
            int height = display.getHeight();
            int width = display.getWidth();
            String resolution = height > width ? height + "x" + width : width + "x" + height;
            ApiConfig.setResolutionStr(resolution);
            // densityDpi = 120dpi is ldpi, densityDpi = 160dpi is mdpi,
            // densityDpi = 240dpi is hdpi, densityDpi = 320dpi is xhdpi            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);
            int densityDpi = dm.densityDpi;
            ApiConfig.setDensityDpi(densityDpi);
        }
    }
複製程式碼

如果需要為Android pad定製資原始檔,則res目錄下的目錄可能為:

drawable

drawable-ldpi

drawable-mdpi

drawable-hdpi

drawable-xhdpi

drawable-nodpi

drawable-nodpi-1024×600

drawable-nodpi-1280×800

drawable-nodpi-800×480

values

values-ldpi

values-mdpi

values-hdpi

values-xhdpi

values-nodpi

values-nodpi-1024×600

values-nodpi-1280×800

values-nodpi-800×480

Android上常見度量單位:
  px(畫素):螢幕上的點,絕對長度,與硬體相關。
  in(英寸):長度單位。
  mm(毫米):長度單位。
  pt(磅):1/72英寸,point。
  dp(與密度無關的畫素):一種基於螢幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
  dip:Density-independent pixel,同dp相同。
  sp:在dp的基礎上,還與比例無關,個人理解為是一個向量圖形單位。

引入dp/dip的原因: 
  過去,程式設計師通常以畫素為單位設計計算機使用者介面。例如,定義一個寬度為300畫素的表單欄位,列之間的間距為5個畫素,圖示大小為16×16畫素 等。這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上執行該程式,則使用者介面會顯得很小。在有些情況下,使用者介面可能會小到難以看清 內容。與解析度無關的度量單位可以解決這一問題。

如何計算密度(請參照原帖:http://www.devdiv.com/thread-28610-1-1.html);
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。

如何做到與密度無關:
  如果螢幕密度為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).


附:
        傳說iPhone/Mac的設計從一開始就考慮到對任意解析度的支援,iOS的所有介面元素用的都已經是向量化了的圖片,UI介面是系統級別的與密度無關;而Android雖然支援任意解析度,但不是系統全域性的,求證。

相關推薦

Android hdpinodpisw600dp-xhdpisw720dp-xhdpixhdpi

術語和概念 螢幕尺寸 螢幕的物理尺寸,以螢幕的對角線長度作為依據(比如 2.8寸, 3.5寸)。  簡而言之, Android把所有的螢幕尺寸簡化為三大類:大,正常,和小。  程式可以針對這三種尺寸的螢幕提供三種不同的佈局方案,然後系統會負責把你的佈局方案以合適的方式渲染到對應的螢幕上,這個過程是不需要程

針對iPhone的ptAndroid的dpHTML的css像素與dpr設計尺寸和物理像素的淺分析

display 基本 stand 理解 android開發 height 請問 技術 -a   最近被一朋友問到:css中設置一DOM的height:65px,請問顯示的高度是否和Android的65dp的元素等高?腦子裏瞬間閃現了一堆的概念,如dpr,ppi,dp,pt等

Android視音頻編碼器(2)——cameraYUVAudioRecordPCM分別編碼後muxer成mp4

效率 androi mar 視音頻 pop 采集 con 文章 cpu 參考下面這篇文章: http://blog.csdn.net/a992036795/article/details/54286654 一、前言 上一篇文章我講到,我用libx264對視頻

Android中使App高速簡單地支持新浪微博微信QQfacebook等十幾個主流社交平臺的分享功能

分析 ont renren androidm mod 執行 xen 12px 操作 前言 在如今的APP或者遊戲中,分享功能差點兒已經成為標配。分享功能不但能夠滿足用戶的需求。也能夠為產品帶來很多其它的用戶,甚至能夠對用戶的行為、活躍度、年齡段等情況進行數據統計,使得軟

Android Gradle Plugin指南(三)——依賴關系android庫和多項目配置

tool 全部 ocs 共享 項目路徑 多項目配置 path 用戶 so文件 原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-L

Android 調用系統分享文字圖片文件,可直達微信朋友圈QQQQ空間微博

gem 朋友 con vmpolicy false 錯誤 區分 指定 如果 原文:Android 調用系統分享文字、圖片、文件,可直達微信、朋友圈、QQ、QQ空間、微博 兼容SDK

android UI設計圖片和文字尺寸px對應dpsp值換算

螢幕尺寸:指螢幕的對角線長度,單位是英寸,1英寸等於2.54釐米,常見尺寸有2.4,2.8,3.5,3.7,4.2,5.0,5.5,6.0等。 螢幕解析度:指在縱橫向上的畫素點數,單位是px,1px為一個畫素點,一般格式為縱向畫素*橫向畫素,如1960*1080。 螢幕畫素密度:相同尺寸

android平臺下基於MediaRecorder和AudioRecord實現錄製AACPCM音訊資料

音視訊實踐學習 android全平臺編譯ffmpeg以及x264與fdk-aac實踐 ubuntu下使用nginx和nginx-rtmp-module配置直播推流伺服器 android全平臺編譯ffmpeg合併為單個庫實踐 android-studio使用c

Android立體聲pcm的資料結構,左右聲道拆分左右聲道反轉

立體聲pcm資料結構 Android錄音預設錄製生成的是pcm檔案,假設我們設定取樣率為16K,錄音型別為AudioFormat.CHANNEL_IN_STEREO(立體聲錄音),資料型別為AudioFormat.ENCODING_PCM_16BIT。 則pcm檔案的資料結構大致為2byte左聲道、2byte

Android:關於 Intent元件的那些小事(介紹使用方法等)

前言 Intent在Android開發的應用非常常見 今天我就帶給大家簡單講一下Intent的相關知識 & 其用法 目錄 1. 定義 意圖,描述的是應用的動作 & 其對應的資料

Android】adb抓取不同分類Log(kernelradioeventmain)和獲取ANR log

Log分類     Android日誌主要分為kernel、radio、event、main這四種log。 Kernel Log     kernel log屬於Linux核心的log ,可以通過讀取/proc/kmsg或者通過串列埠來抓取。     adb 抓取ke

arcgis runtime for android 100.3開發學習(一)(點面,圖層的建立)

本節我們來學習一下arcgis runtime for android方面的相關內容,一一學習相關方面的api知識。這個案例是摘取github官網上面的。主要建立圖形案例的點、線、面,當然還有圖層的建立。來看一下實現的程式碼。 package com.example.arc

【安卓本卓】Android系統原始碼篇之(一)原始碼獲取原始碼目錄結構及原始碼閱讀工具簡介

前言 古人常說,“熟讀唐詩三百首,不會作詩也會吟”,說明了大量閱讀詩歌名篇對學習作詩有非常大的幫助。做開發也一樣,Android原始碼是全世界最優秀的Android工程師編寫的程式碼,也是Android開發中絕對的權威所在。Android系統開源,且佔據了當今手機系統世界的絕大部分江山,各大手機廠商要做手機系

Android Studio使用的那些事(一)安裝重灌啟動

今天開啟Android Studio歡迎介面突然就變了,建立新專案、開啟以前專案真的是一臉懵逼!如下圖: 以為是哪裡配置的問題倒騰了半個小時沒倒騰明白,然後去網上搜索各種關鍵字都是講一些AndroidStudio安裝啟動配置的事情,沒能解決最後靈機一試解決了。然後就順便想把網易部落格以

Android事件分發機制:基礎篇:最全面最易懂

如何提升安卓水平?安卓開發者必須瞭解的事件分發機制。 最全面、最易懂的形式來講解Android事件分發機制。 0. 前言 鑑於安卓分發機制較為複雜,故分為多個層次進行講解,分別為基礎篇、實踐篇與高階篇。 (一)基礎篇:從基本概念入手,介紹了分發機制中的核心方法,通過分析其核心邏輯,總結其事件分發機制。 (

Android TextView中文字通過SpannableString來設定超連結顏色字型等屬性

  在Android中,TextView是我們最常用的用來顯示文字的控制元件。   一般情況下,TextView中的文字都是一個樣式。那麼如何對於TextView中各個部分的文字來設定字型,大小,顏色,樣式,以及超級連結等屬性呢?下面我們通過SpannableString的

Android studio 在資原始檔strings.xml中新增空格換行符

<string name="aiyisi_tip">\t\t愛義思(上海)科技發展有限公司,國家級高新技術企業,成立於2012年。\n\t\t愛義思來自Acesmart的音譯。\n\t\t愛義思的使命是:一流智慧產品 創造美好生活,讓生活不在難!\n\t\t愛義思奉行“敬天愛人

Android-Mac電腦如何進行APK反編譯-使用apktooljd-gui

最近群裡有人問如何在mac下進行apk反編譯,我也沒試過,以前都是在windows下進行反編譯的,windows下很簡單,有許多比較好的整合工具,如apkide(改之理),不過我猜mac下應該和win

Android JNI程式設計(六)——C語言函式指標Unition聯合體列舉Typedef別名結構體結構體指標

一:函式指標 1.函式指標顧名思義就是定義一個指標變數指向一個函式,和一級指標並沒有很大的區別我們看如下程式碼就很清楚的知道了 #include<stdio.h> #include<stdlib.h> //定義一個函式 in

Android 使用shape定義不同控制元件的的顏色背景色邊框色

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/