Android 屏幕適配全攻略(上)-掌握屏幕單位,應對千變萬化的設備


本文從 Android 開發中常見的長度單位 px、dp、sp 入手,詳細介紹了它們的特點及轉換關系。

接著深入探討了屏幕尺寸、分辨率、像素密度等重要的屏幕指標,幫助讀者全面理解它們之間的聯系。最后,通過實例代碼演示了如何在代碼中進行單位轉換,為完美適配各種設備屏幕奠定基礎。

通過本文的學習,相信讀者一定能掌握 Android 多屏適配的各種技巧,打造出真正"一網打盡"的應用程序。


一、長度單位


1、px 像素

在這里插入圖片描述


px 是 Pixel 的縮寫,它是屏幕上最小的顯示單位,通常代表一個點或一個圖像單元。在數字圖像處理和 Web 開發中,px 是最常用的長度單位。但在移動開發中,我們應該優先考慮使用相對單位,以確保內容在不同設備上能夠正確顯示。


  • 定義

    • px 是相對長度單位,它表示一個顯示設備上的物理像素。
    • 每個 px 對應屏幕上的一個小方塊,這些小方塊組合在一起構成了我們看到的圖像。

  • 特點

    • px 是絕對單位,它不會隨著屏幕分辨率或縮放比例而變化。
    • 不同設備的 px 尺寸可能不同,因為它們的物理像素密度(DPI)不同。

  • 在開發中,px 常用于設置元素的大小、位置等屬性。

  • 在不同設備上,同樣的 px 值可能會渲染出不同的實際大小,這是因為設備 DPI 不同。

2、比例像素(scaled pixels -sp)


(1)、什么是 sp?

  • sp (scale-independent pixels) 是一種相對長度單位,主要用于設置字體大小。

  • 它和 dp 類似,也會根據用戶的字體大小設置進行縮放。

  • 通常情況下,sp 和 dp 的轉換比例是 1:1,但是如果用戶改變了系統字體大小設置,sp 會隨之變化,而 dp 不會。


(2)、為什么要使用 sp?

  • 相比于 px,sp 可以確保文字在不同設備上顯示的大小保持一致。

  • 這是因為 sp 會根據用戶的字體大小設置進行縮放,而 px 則不會。

  • 比如,即使在不同分辨率或密度的設備上,使用 sp 設置的字體大小看起來都會相同。


(3)、如何使用 sp?

  • 在 XML 布局文件中,可以使用sp單位來設置文字的大小:

    <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp" />
    

(4)、sp 與 dp 的區別

  • dp 是獨立于屏幕密度的相對長度單位,而 sp 是獨立于用戶字體大小設置的相對長度單位。
  • 在大多數情況下,sp 和 dp 的轉換比例是 1:1,但是如果用戶改變了系統字體大小設置,sp 會隨之變化,而 dp 不會。
  • 因此,對于設置文字大小,我們應該優先使用 sp 而不是 px 或 dp,以確保文字在不同設備上顯示的大小一致。

3、與設備無關像素(device independent pixels -dip/dp )


(1)、什么是 dp/dip?

  • dp (density-independent pixels) 和 dip (device-independent pixels) 是同一個概念,指的是一種相對長度單位。

  • 它獨立于設備的屏幕密度,可以確保在不同分辨率和屏幕密度下,UI 元素的物理尺寸保持一致。

  • 1 dp 等于 1/160 英寸,也就是說在 160 dpi 的屏幕上,1 dp 等于 1 px。


(2)、為什么要使用 dp/dip?

  • 在不同的設備上,相同的 px 值可能會渲染出不同的實際大小,這是因為設備 DPI 不同。

  • 使用 dp/dip 可以解決這個問題,因為它會根據設備的屏幕密度進行自動縮放,確保 UI 元素在不同設備上保持相同的物理尺寸。

  • 這對于開發者來說非常重要,因為它可以確保應用在各種設備上都能正常顯示和運行。


(3)、如何使用 dp/dip?

  • 在 XML 布局文件中,可以使用dp單位來設置 UI 元素的大小:

    <TextViewandroid:layout_width="200dp"android:layout_height="50dp"android:textSize="16sp" />
    

4、cm 厘米 & inch 英寸


在這里插入圖片描述


在這里插入圖片描述


厘米和英寸是兩種常用的長度單位,在日常生活和應用開發中,需要經常進行單位轉換。


厘米(cm)與英寸(inch)的換算關系

  • 1 英寸(inch) = 2.54 厘米(cm)
  • 1 厘米(cm) = 0.393701 英寸(inch)

這是一個標準的換算關系,不會發生變化。

它是基于國際單位制(SI)和英制單位之間的轉換標準。

public class UnitConverter {public static double cmToInch(double cm) {return cm * 0.393701;}public static double inchToCm(double inch) {return inch * 2.54;}
}// 使用示例
double centimeters = 10.0;
double inches = UnitConverter.cmToInch(centimeters);
System.out.println(centimeters + " cm = " + inches + " inches");double inchesValue = 5.0;
double centimetersValue = UnitConverter.inchToCm(inchesValue);
System.out.println(inchesValue + " inches = " + centimetersValue + " cm");

輸出結果:

10.0 cm = 3.93701 inches
5.0 inches = 12.7 cm

5、pt點數

標準的長度單位,1pt=1/72英寸,用于印刷業,非常簡單易用


二、屏幕單位


1、屏幕尺寸


(1)、屏幕尺寸是指物理尺寸.(如手機屏幕、電腦屏幕、LED 屏幕都是真實存在的尺寸).

(2)、屏幕尺寸指的屏幕對角線的長度

(3)、屏幕尺寸單位英寸(inch),一英寸大約 2.54cm


常見的手機屏幕尺寸有 4.7 英寸、5.0英寸、5.5 英寸、6.0 英寸等。

在這里插入圖片描述


在 Android 中獲取屏幕尺寸的常用方法有以下幾種:

(1)、使用 DisplayMetrics 類

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;

(2)、使用 WindowManager 類

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

(3)、使用 Resources 類

Resources resources = getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

(4)、使用 Configuration 類

Configuration configuration = getResources().getConfiguration();
int widthDp = configuration.screenWidthDp;
int heightDp = configuration.screenHeightDp;

2、分辨率(Image resolution)

分辨率,可以從屏幕分辨率與圖像分辨率兩個方向來分類。


(1)、屏幕分辨率

在 Android 設備中的分辨率指的是屏幕分辨率,即屏幕上可顯示的像素數量,它決定了屏幕的顯示質量。分辨率越高,能夠顯示的細節就越豐富,圖像就會越清晰。常見的分辨率有:

  • 標清(SD)分辨率:640x480
  • 高清(HD)分辨率:1280x720
  • 全高清(FHD)分辨率:1920x1080
  • 2K分辨率:2048x1080
  • 4K分辨率:3840x2160

(2)、圖像分辨率

圖像分辨率反映了圖像的細節程度和表現力,是描述圖像質量的一個重要指標,它主要體現在以下幾個方面:

  • 像素數量

    • 圖像分辨率指的是圖像中包含的像素點的數量,通常用寬度x高度的形式表示,例如 1920x1080、3840x2160等。
    • 像素數量越多,圖像的細節越豐富,畫面越清晰。
  • 像素密度

    • 像素密度又稱為PPI(Pixels Per Inch)或DPI(Dots Per Inch),表示每英寸內的像素數量。
    • 像素密度越高,圖像在同等物理尺寸下看起來越清晰細膩。
  • 色深

    • 色深描述了圖像中每個像素可表示的顏色數量。

    • 色深越高,圖像的色彩表現力就越強。常見的色深有8位(256色)、16位(65,536色)、24位(1,670萬色)等。


3、屏幕密度或像素密度(Dots Per Inch-DPI)


DPI 是一個表示圖像分辨率的單位,它描述了每英寸圖像中包含的像素或點的數量。換句話說,DPI 值越高,圖像的細節和清晰度就越高。


(1)、DPI 的重要性

主要體現在以下幾個方面:

  • 顯示質量

    • DPI 值高意味著在相同的物理空間內,顯示的細節更豐富、更清晰。
    • 在同樣的物理尺寸下,高 DPI 顯示屏能提供更好的顯示效果。
  • 打印質量

    • 打印輸出的細節和清晰度與 DPI 值息息相關。
    • 一般情況下,打印機的 DPI 值越高,打印出的圖像越清晰。
  • 圖像品質

    • 數字圖像的 DPI 值決定了圖像的最終分辨率和細節表現。
    • 在同等物理尺寸下,DPI 值高的圖像能提供更好的顯示和打印效果。

(2)、常見的 DPI 值

  • 72 DPI:Windows 操作系統的默認 DPI 值,用于屏幕顯示。
  • 96 DPI:Windows XP 及以后版本的默認 DPI 值,用于屏幕顯示。
  • 150-300 DPI:一般打印輸出的 DPI 值范圍,可以提供較高的打印質量。
  • 300-600 DPI:高質量打印輸出的 DPI 值范圍,可以達到非常清晰的效果。
  • 1200-2400 DPI:工業級打印機的 DPI 值范圍,用于高精度的商業印刷。

比如:打印機 600 DPI 分辨率,表示打印機可以在每一平方英寸的面積中可以輸出 600 x 600 = 360000 個輸出點。


4、圖像的采樣率(PPI)


(1)、PPI是什么?


每英寸像素數(Pixels Per Inch, PPI) 是指每英寸屏幕上的像素數量,通俗來說就是屏幕上每英寸有多少個像素點。

在這里插入圖片描述


它是一個非常重要的顯示技術指標,可以反映屏幕的清晰度和細膩程度,PPI 越高,屏幕顯示的內容就越細膩清晰。


(2)、PPI 的計算公式


PPI = √(寬度像素數^2 + 高度像素數^2) / 對角線英寸

請添加圖片描述


上圖公式是關于分辨率、PPI、尺寸三者之間的關系。

  • 疑問:√(寬度像素數^2 + 高度像素數^2) 表示什么?

勾股定理: a2+b2=c^2 兩條直角邊的平方和等于斜邊的平方。

其實√(寬度像素數^2 + 高度像素數^2) 目的就是為了得到屏幕對角線像素數量。

根據橫向、縱向的像素數量使用勾股定理計算對角線平方,然后開平方得出對角線像素數量。


如下圖:
請添加圖片描述


  • PPI計算示例

    假設我們需要 計算 MacBook Pro 13 英寸機型的dpi (像素密度)

? 參數如圖所示:

在這里插入圖片描述


var ppi = Math.sqrt(2560 * 2560 + 1600 * 1600) / 13.3;
console.log(ppi); //≈227

(3)、基于 PPI 屏幕分級

根據屏幕每英寸像素值的不同,Android 中將平板電腦和手機的屏幕分為下面幾類:

密度名稱每英寸像素值圖標尺寸
低密度(LDPI)~120dpi36 x 36 px
中密度(MDPI)120dpi ~ 160dpi48 x 48 px
高密度(HDPI)160dpi ~ 240dpi72 x 72 px
超高密度(XHDPI)240dpi ~ 320dpi96 x 96 px
超超高密度(XXHDPI)320dpi ~ 480dpi144 x 144 px
超超超高密度(XXXHDPI)480dpi ~ 640dpi192 x 192 px

(4)、分辨率、DPI和PPI之間的關系

  • 分辨率決定了整個屏幕或圖像的總像素數量,與屏幕尺寸無關。

  • PPI決定了同等分辨率下,屏幕上每英寸的像素密度。PPI = 分辨率 / 屏幕尺寸(英寸)

  • DPI和PPI在數字顯示設備中是等同的。但在打印領域,DPI描述的是打印機的分辨率,而不是顯示設備的分辨率。


三、px,dp,sp單位轉換


在 Android 中,我們有三種常用的長度單位:px、dp 和 sp,它們之間的轉換關系如下:

1、px (pixels)

  • 像素是屏幕上最小的顯示單位。
  • px 是屏幕實際的像素數量,是絕對長度單位。
  • 它和設備的屏幕密度無關,所以在不同分辨率的設備上,相同的 px 值會占用不同的物理尺寸。

2、dp (density-independent pixels)

  • dp 是一種相對長度單位,它獨立于屏幕密度。
  • 1 dp 等于 1/160 英寸,在不同屏幕密度下,相同的 dp 值會占用相同的物理尺寸。
  • 這是 Android 開發中最常用的長度單位,因為它能夠適應不同的屏幕密度。

3、sp (scale-independent pixels)

  • sp 也是一種相對長度單位,它用于字體大小的設置。
  • 它和 dp 類似,也會根據用戶的字體大小設置進行縮放。
  • 通常情況下,sp 和 dp 的轉換比例是 1:1,但是如果用戶改變了系統字體大小設置,sp 會隨之變化,而 dp 不會。

下面代碼演示 px、dp 和 sp 之間的轉換:

import android.content.Context;
import android.util.DisplayMetrics;
import android.util.TypedValue;public class UnitConverter {public static int dpToPx(Context context, float dp) {DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();return Math.round(dp * displayMetrics.density);}public static int pxToDp(Context context, float px) {DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();return Math.round(px / displayMetrics.density);}public static int spToPx(Context context, float sp) {return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics()));}public static int pxToSp(Context context, float px) {return Math.round(px / context.getResources().getDisplayMetrics().scaledDensity);}
}

使用示例:

// 將 20dp 轉換為 px
int pixels = UnitConverter.dpToPx(this20f);// 將 100px 轉換為 dp
int dp = UnitConverter.pxToDp(this100f);// 將 16sp 轉換為 px
int fontPixels = UnitConverter.spToPx(this16f);// 將 32px 轉換為 sp
int scaledPixels = UnitConverter.pxToSp(this32f);

通過這些轉換函數,我們可以在不同的長度單位之間進行轉換,確保在不同屏幕密度下,UI 元素的尺寸和字體大小保持一致。


結語:

通過本文的學習,相信已經掌握了 Android 多屏適配的核心知識點。但是,隨著移動設備的不斷更新迭代,屏幕適配的挑戰也在不斷變化。此外,針對不同場景的優化策略也需要開發者有所了解和實踐。讓我們一起繼續深入探索 Android 多屏適配的更多精彩內容吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/9882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9882.shtml
英文地址,請注明出處:http://en.pswp.cn/web/9882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三分鐘上手安全滲透系統Kali Linux

kali linux系統集成了常用的安全滲透工具&#xff0c;省去了安裝工具的時間&#xff0c;做安全相關的工作是非常推薦使用的。 安裝Kalii Linux 安裝系統 一般使用虛擬機進行安裝&#xff0c;Kali Linux基于Debian內核&#xff0c;虛擬機的操作系統選擇Debian 7.x 64 選擇系統…

【SRC實戰】一鍵完成全部任務獲取獎勵

挖個洞先 https://mp.weixin.qq.com/s/LkPfJuuP1K8vaFXRn-8wVg “ 以下漏洞均為實驗靶場&#xff0c;如有雷同&#xff0c;純屬巧合 ” 01 — 漏洞證明 一、業務邏輯 “ 如何欺騙APP完成任務獲取獎勵&#xff1f; ” 1、記錄金幣數量20 2、瀏覽商品詳情頁 3、點擊瀏覽提…

我們應該如何做參與式觀察

記得多年以前&#xff0c;有個朋友問我&#xff1a;對于做觀察&#xff0c;有人通過教授繪畫技巧來教人如何做觀察。你們研究員又不會畫畫&#xff0c;你們如何讓人相信你們更會觀察呢&#xff1f;坦率說&#xff0c;當時我被問住了&#xff0c;因為我從來沒有進行過這樣的對比…

day5Qt作業

服務器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//準備組件&#xff0c;初始化組件狀態this->setFixedSize(800,600);chatwidget new QListWidge…

代碼隨想錄算法訓練營第四十九天| 123.買賣股票的最佳時機III,188.買賣股票的最佳時機IV

目錄 題目鏈接&#xff1a;123.買賣股票的最佳時機III 思路 代碼 題目鏈接&#xff1a;188.買賣股票的最佳時機IV 思路 代碼 總結 題目鏈接&#xff1a;123.買賣股票的最佳時機III 思路 與之前買賣股票不同的是本題要求最多買賣兩次&#xff0c;那么dp數組以及遞推公式都…

攻擊者正在利用AI,對保險公司發起大規模欺詐

保險欺詐一直是保險行業面臨的重要挑戰之一&#xff0c;尤其隨著技術的進步&#xff0c;欺詐者也在不斷更新其手段&#xff0c;利用AI技術&#xff0c;包括生成式模型、機器學習和數據分析工具等欺騙保險公司&#xff0c;而AI技術的應用正成為他們的新工具&#xff0c;使其犯罪…

如何打造個人IP?

打造個人IP&#xff08;Intellectual Property&#xff09;是當今社會中越來越受到關注的話題。個人IP指的是個人在某個領域內所擁有的獨特的、具有商業價值的知識、技能、品牌和影響力。為什么要打造個人IP&#xff1f;如何打造個人IP&#xff1f;下面我將為您詳細解答。 首先…

Navicat連接遠程數據庫時,隔一段時間不操作出現的卡頓問題

使用 Navicat 連接服務器上的數據庫時&#xff0c;如果隔一段時間沒有使用&#xff0c;再次點擊就會出現卡頓的問題。 如&#xff1a;隔一段時間再查詢完數據會出現&#xff1a; 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

LinkedList鏈表

LinkedList 的全面說明 LinkList底層實現了雙向鏈表和雙端隊列特點可以添加任意元素&#xff08;元素可以重復&#xff09;&#xff0c;包括null線程不安全&#xff0c;沒有實現同步 LinkedList 的底層操作機制 LinkedList底層維護了一個雙向鏈表LinkList中維護了兩個屬性fi…

【算法入門賽】A.坐標變換(推薦學習)C++題解與代碼

比賽鏈接&#xff1a;https://www.starrycoding.com/contest/8 題目描述 武漢市可以看做一個二維地圖。 牢 e e e掌握了一項特異功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分別設定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置會…

【Fastadmin】表格列改input框輸入編輯,以排序權重為例

目錄 1.自定義權重排序,以字段sort為例 js列代碼 在// 初始化表格table.bootstrapTable({ });的后面添加事件 api里面增加formatter方法,如果存在角色權限問題,控制器添

谷歌外鏈怎么發?

既要數量也要質量&#xff0c;要保證你的鏈接廣泛分布&#xff0c;在數量上&#xff0c;確實需要你的鏈接在各種平臺上有所展現&#xff0c;這樣能提升你網站的知名度和曝光率&#xff0c;但是&#xff0c;光有數量是不夠的&#xff0c;如果這些鏈接的內容不行&#xff0c;那對…

ARIMA模型在河流水質預測中的應用_含代碼

#水質模型 #時間序列 #python應用 ARIMA 時間序列模型簡介 時間序列是研究數據隨時間變化而變化的一種算法&#xff0c;是一種預測性分析算法。它的基本出發點就是事物發展都有連續性&#xff0c;按照它本身固有的規律進行。ARIMA(p,d,q)模型全稱為差分自回歸移動平均模型 (A…

SSH文件傳輸

一、設置SSH密鑰對&#xff0c;實現記住密碼 要避免每次使用scp或ssh時都輸入密碼&#xff0c;你可以設置SSH密鑰對&#xff08;一對公鑰和私鑰&#xff09;&#xff0c;并將公鑰添加到遠程服務器上。這樣&#xff0c;你的系統可以通過密鑰自動驗證身份&#xff0c;而無需手動…

Blazor入門-基礎知識+vs2022自帶例程的理解

參考&#xff1a; Blazor 教程 - 生成首個應用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基礎知識&#xff1a;Visual Studio 2022 中的Blazor開發入門_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

NSSCTF | [SWPUCTF 2021 新生賽]jicao

打開題目&#xff0c;發現高亮顯示了一個 php 腳本 這是腳本的內容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

idea中數據庫的連接(保姆級)

點擊idea中的database 然后再點擊加號 創建 然后選擇第一欄data source 再選擇mysql 然后選擇數據庫的連接方式 再輸入密碼 這里我們本來就是localhost所有就不用改 選擇端口號 然后點擊Test Connection 測試連接 第一次連接會下載連接的文件 我們只需要 等待它下載完成就好了 …

文本批量操作指南:文本合并技巧,批量處理大量文本的方法

在數字化時代&#xff0c;文本處理成為我們日常生活和工作中不可或缺的一部分。無論是整理文檔、數據分析還是內容創作&#xff0c;我們都需要處理大量的文本數據。為了提升工作效率&#xff0c;掌握文本批量操作和合并的技巧變得尤為重要。本文將為您提供一份詳細的文本批量操…

機器學習算法應用——CART決策樹

CART決策樹&#xff08;4-2&#xff09; CART&#xff08;Classification and Regression Trees&#xff09;決策樹是一種常用的機器學習算法&#xff0c;它既可以用于分類問題&#xff0c;也可以用于回歸問題。CART決策樹的主要原理是通過遞歸地將數據集劃分為兩個子集來構建決…

力扣 256. 粉刷房子 LCR 091. 粉刷房子 python AC

動態規劃 class Solution:def minCost(self, costs):row, col len(costs), 3dp [[0] * col for _ in range(row 1)]for i in range(1, row 1):for j in range(col):dp[i][j] costs[i - 1][j - 1]if j 0:dp[i][j] min(dp[i - 1][1], dp[i - 1][2])elif j 1:dp[i][j] m…