Android中dip、dp、sp、pt和px的區別

来源:http://www.cnblogs.com/gisoracle/archive/2016/03/10/5262183.html
-Advertisement-
Play Games

1、概述 過去,程式員通常以像素為單位設計電腦用戶界面。例如:圖片大小為80×32像素。這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上運行該程式,則用戶界面會顯得很小。在有些情況下,用戶界面可能會 <?xml version="1.0" encoding="utf-8"?> <


1、概述

        過去,程式員通常以像素為單位設計電腦用戶界面。例如:圖片大小為80×32像素。這樣處理的問題在於,如果在一個每英寸點數(dpi)更高的新顯示器上運行該程式,則用戶界面會顯得很小。在有些情況下,用戶界面可能會

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="3dip">


    <!--0固定1可以擴展-->

    <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:numColumns="8"
        android:shrinkColumns="0"
        android:stretchColumns="1">

        <TableRow
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="請輸入用戶名:" />
            <!-- 這個EditText放置在上邊id為label的TextView的下邊 -->
            <EditText
                android:id="@+id/username"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/label"
                android:background="@android:drawable/editbox_background" />

        </TableRow>


        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="match_parent">


        </TableRow>


    </TableLayout>


    <Button android:layout_width="800px"
        android:layout_height="200px"
        android:text="800px"/>

    <Button android:layout_width="400dip"
        android:layout_height="100dip"
        android:text="400dip"/>
</LinearLayout>
package com.example.yanlei.my2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView pTextView=(TextView)findViewById(R.id.label);

        // 獲取屏幕密度(方法1)
        int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕寬(像素,如:480px)
        int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)

        String str=  "  getDefaultDisplay ,screenWidth=" + screenWidth + "; screenHeight=" + screenHeight+"\n";

        // 獲取屏幕密度(方法2)
        DisplayMetrics dm = new DisplayMetrics();
        dm = getResources().getDisplayMetrics();

        float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
        int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)
        float xdpi = dm.xdpi;
        float ydpi = dm.ydpi;

        str=str + "  DisplayMetrics, xdpi=" + xdpi + "; ydpi=" + ydpi+"\n";
        str=str + "  DisplayMetrics, density=" + density + "; densityDPI=" + densityDPI+"\n";

        screenWidth  = dm.widthPixels;      // 屏幕寬(像素,如:480px)
        screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)

        str=str  + "  DisplayMetrics screenWidth=" + screenWidth + "; screenHeight=" + screenHeight+"\n";

        // 獲取屏幕密度(方法3)
        dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
        densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)
        xdpi = dm.xdpi;
        ydpi = dm.ydpi;

        str=str +  "  DisplayMetrics xdpi=" + xdpi + "; ydpi=" + ydpi+"\n";
        str=str  + "  DisplayMetrics, density=" + density + "; densityDPI=" + densityDPI+"\n";

        int screenWidthDip = dm.widthPixels;        // 屏幕寬(dip,如:320dip)
        int screenHeightDip = dm.heightPixels;      // 屏幕寬(dip,如:533dip)

        str=str + "  DisplayMetrics screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip+"\n";

        screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕寬(px,如:480px)
        screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)

        str=str + "  DisplayMetrics screenWidth=" + screenWidth + "; screenHeight=" + screenHeight+"\n";
        pTextView.setText(str);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

小到難以看清內容。由此我們採用與解析度無關的度量單位來開發程式就能夠解決這個問題。Android應用開發支持不同的度量單位。

2、度量單位含義

      dip: device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬體有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依賴像素。 

     dp: dip是一樣的

     px: pixels(像素). 不同設備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。

     pt: point,是一個標準的長度單位,1pt=1/72英寸,用於印刷業,非常簡單易用;
     sp: scaled pixels(放大像素). 主要用於字體顯示best for textsize。

    in(英寸):長度單位。 
    mm(毫米):長度單位。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我的天! 折騰了好久終於搭建成功了第一個項目。 項目環境: Windows 7 家庭普通版 64位 Android studio 1.5.1 OpenCV-2.4.9-android-sdk 基於Android studio上OpenCv開發環境的配置請參考 http://www.cnblogs.c
  • 最近開發android軟體客戶要安裝在樂視TV上,而且要求是開機自啟。我很天真的以為寫一個廣播接收類接收開機廣播就可以了,可是根本不會,有的設備就是不可以接收到開機廣播,於是各種百度搜索。大神們說是只有系統軟體才可以監聽到開機廣播,於是我要把自己的應用升級為系統應用..... 就先說如何將自己的應用
  • 本文譯自iOS 7 Blur Effects with GPUImage。 iOS 7在視覺方面有許多改變,其中非常吸引人的功能之一就是在整個系統中巧妙的使用了模糊效果。許多第三方應用程式已經採用了這樣的設計細節,並以各種奇妙的和具有創造性的方式使用它。 本文將通過幾種不同的技術來實現iOS 7中的
  • 本文譯自:Cookbook: Moving Table View Cells with a Long Press Gesture 目錄: 你需要什麼? 如何做? 如何將其利用至UICollectionView上? 何去何從? 本次的 cookbook-style 教程中介紹如何通過長按手勢來移動 t
  • 在android開發中,常常有聯繫人頁面,在這篇和大家分享一下項目中剛剛添加的聯繫人頁面,代碼直接從項目中提取出來,沒有太多時間修改;使用 StickyListHeaders-master 開源項目及SiderBar。先上圖看看效果。 同時用的三方jar包有:glide pinyin4j。原理還是相
  • 在 GCD 中,加入了兩個非常重要的概念:任務和隊列一個線程是可以擁有多個執行隊列的,所有任務是添加到隊列中等待執行的主隊列是特殊的串列隊列,自己創建的隊列可以指定串列或並行,全局隊列是並行隊列 任務:即操作,你想要乾什麼,說白了就是一段代碼,在 GCD 中就是一個 Block,所以添加任務十分方便
  • // 導入 AVFoundation.framwork 框架#import "HDCodeViewController.h" #import "HDNormalViewController.h" #import <AVFoundation/AVFoundation.h> @interface HDC
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...