跳轉到內容

Android/API 概述

來自華夏公益教科書

API 概述

[編輯 | 編輯原始碼]

以下是 Android API 中一些最重要的包名稱空間和類的概述。

API 版本

[編輯 | 編輯原始碼]

Android 的新版本引入了新功能,有時還會放棄對舊功能的支援。Android 的每個版本都有一個相關的 API 等級,並且每個應用程式在其清單中宣告其“最低”和“目標”SDK 版本(即 API 等級)。最低 API 等級表明它將無法與任何舊的 Android 版本一起使用(或至少未經過測試),並且可能會崩潰。目標 API 等級用於調整 Android 系統的一些自動行為,以匹配應用程式的預期。

日期和時間

[編輯 | 編輯原始碼]

Java(和 Android)提供了大量令人困惑的不同類來處理日期和時間。本節將嘗試闡明這些複雜的問題。

  • java.util.GregorianCalendar — 這是用於構造和操作日期和時間的主要類。請注意,許多重要方法來自其 java.util.Calendar 超類。
  • java.util.TimeZone — 提供有關當前系統時區以及系統瞭解的其他可用時區的資訊。
  • java.util.Date — 儘管大多數建構函式和方法已棄用,但它仍然是一個必不可少的類。你可以透過呼叫其 getTime 方法從 Calendar 物件中獲取其中一個。你唯一需要此類物件的原因是格式化例程不適用於日曆物件!
  • java.text.DateFormat — 在這裡你將找到用於執行與區域設定相關的日期格式化的函式。請注意,它們僅適用於 Date 物件,不適用於日曆GregorianCalendar物件。
  • android.text.format.DateFormat — 用於獲取適合使用者的當前區域設定/格式設定的便利例程java.text.DateFormat物件。還允許你根據自定義格式格式化日期。
  • java.text.SimpleDateFormat — 允許你建立自定義日期格式。
  • java.util.SimpleTimeZone — 不確定這有什麼意義。為什麼要定義自己的時區?

2D 圖形概念

[編輯 | 編輯原始碼]

Android 2D 圖形 API 概述。

畫布 提供了基本的繪圖上下文。大多數小部件的螢幕繪製是在其對 View.onDraw 的重寫中完成的,該重寫將一個畫布傳遞到其中它們渲染其顯示。或者,如果你想在應用程式指示的時間而不是系統指示的時間進行繪製,那麼你可以使用 表面檢視

你還可以建立自己的畫布物件來執行離屏渲染。你透過將它們包裝在一個你設定的點陣圖物件周圍來做到這一點。

正常的畫布座標系具有從左到右遞增的 X 座標,以及從上到下遞增的 Y 座標,(0, 0) 位於繪圖區域的左上角。但是,你可以透過矩陣變換繪圖來改變這一點。

點陣圖

[編輯 | 編輯原始碼]

點陣圖 是畫素陣列的容器。你既可以提供畫素(在這種情況下,點陣圖是不可變的——即圖形 API 不會繪製到其中),也可以讓圖形 API 自己分配空間(在這種情況下,點陣圖是可變的——可以繪製到其中)。在後一種情況下,你必須記住在你完成點陣圖後呼叫 recycle 方法;與文件所說“這是一個高階呼叫,通常不需要呼叫”相反,如果你建立了許多可變點陣圖但沒有這樣做,你很可能會遇到“記憶體不足”錯誤。

顏色值

[編輯 | 編輯原始碼]

畫素顏色在許多地方被指定為一個 32 位整數,其中 alpha、紅色、藍色和綠色元件各佔 8 位。假設“alpha”、“紅色”、“藍色”和“綠色”都是 0 .. 255 範圍內的整數,你可以將它們構建成一個顏色值,如下所示

    int color = 
          alpha >> 24 
        | red >> 16 
        | green >> 8
        | blue;

API 不會強制執行 alpha 是否為預乘。但是,Porter-Duff 傳輸模式 實際上只有在預乘 alpha 的情況下才能給出正確的結果。

一個 Paint 物件包含各種設定,用於控制將某個物件繪製到 Canvas 上:使用的顏色,要應用的傳輸模式和過濾效果,路徑渲染設定以及文字設定。

字型

[edit | edit source]

一個 Typeface 是你指定字型的形式。請注意,系統預裝的字型數量有限,並且沒有(官方)新增更多字型的規定。如果你想要更多的字型,你必須將它們包含在你的應用程式中,或者從使用者下載區域訪問它們,或者其他方法。

路徑

[edit | edit source]

一個 Path 是一個可縮放幾何物件的表示。它可以像一個簡單的圓、橢圓或矩形,也可以更復雜,包含由三次和二次貝塞爾曲線以及直線段組成的多個片段。路徑可以填充或描邊。它也可以用來在 Canvas 中剪下繪圖。

請注意,沒有等效於 PostScriptpathforall運算子:無法讀取路徑定義的元件。如果你需要維護這些資訊,你需要定義自己的幾何物件,它將根據需要將其內容轉換為路徑。

著色器

[edit | edit source]

一個 Shader 為你提供了使用 Paint 繪製圖形的更高階選項。預設情況下,Paint 會渲染一個單一平面的顏色區域,但設定合適的著色器型別,你可以選擇應用漸變填充、用點陣圖影像填充以及它們的組合。

為什麼我的圖形看起來如此鋸齒?

[edit | edit source]

圖形 API 包含抗鋸齒選項,但預設情況下這些選項未啟用(為什麼?舊硬體上的效能問題?)。為了使事物看起來更好,請使用 Paint.setAntiAlias 來渲染平滑的幾何圖形,並使用 Paint.setFilterBitmap 來平滑地縮放點陣圖。

另請參閱

[edit | edit source]

Romain Guy 和 Chet Haase 在 Devoxx 2010 Java 大會上發表的影片 Android Graphics and Animations概述了圖形 API 以及如何進行動畫。

"Loading Bitmaps from the Gallery" 來自 Android Code Fragments。

2D 與 3D 圖形

[edit | edit source]

Android 對 2D 和 3D 圖形使用完全不同的 API。2D 圖形 API 基於 Google 收購的建立該公司的 Skia 圖形庫。3D 圖形 API 是 OpenGL-ES,即著名的跨平臺 OpenGL 3D 圖形 API 的“可嵌入”子集。

2D 圖形引擎完全整合到 UI 中,用於所有視窗、小部件等的螢幕繪製。例如,要建立你自己的自定義小部件,只需子類化View,在它的onDraw方法中執行任何你想要的自定義渲染,並在onTouchEvent.

中進行事件處理。3D 圖形並沒有那麼無縫地整合。進行螢幕 3D 顯示的最簡單方法是子類化GLSurfaceView,此外你還需要提供GLSurfaceView.Renderer的自定義子類,它執行實際的設定和繪製。

一個GLSurfaceView提供了兩種“渲染模式”,透過呼叫setRenderMode: RENDERMODE_CONTINUOUSLY來選擇,在這種模式下,你的Renderer會不斷地被呼叫來渲染場景(預設值),以及RENDERMODE_WHEN_DIRTY,在這種模式下,你的Renderer只會在你進行requestRender時被呼叫。請注意,這與正常的 2D 小部件完全不同,正常的 2D 小部件只在響應invalidate呼叫時才會(重新)繪製。

請注意座標系之間的差異:在 2D 圖形 API 中,y 座標向遞增,而在 OpenGL 中,它們向遞增。

圖形基本元素

[edit | edit source]

可用的圖形基本元素在 3D 中更加有限。在 2D 中,你擁有文字、路徑、可繪製物件和圖片等複雜實體,而在 3D 中,你只有點、線和三角形。特別是,所有物件表面必須由三角形構成;曲線表面在有限的程度上透過細分為更小的三角形來近似,但更重要的是透過啟用平滑著色來欺騙眼睛,使眼睛看到連續的漸變而不是角面。

可以透過將 2D 影像渲染到點陣圖,然後在 3D 中將其用作物件表面上的紋理,從而在 3D 中使用 2D 圖形。

還要注意,OpenGL 嚴格來說是一個螢幕即時渲染 API:它沒有定義用於在持久儲存中儲存場景/模型的“檔案格式”,並且它不支援 CPU 密集型功能,如光線追蹤、輻射度等等。

OpenGL-ES 與普通 OpenGL

[edit | edit source]

OpenGL-ES 省略了 OpenGL 的各種功能,這些功能被認為在嵌入式環境中具有過高的實現開銷。OpenGL-ES 1.1 基於 OpenGL 1.5,區別在於

  • 沒有Begin/End分組和用於單獨指定頂點資訊的關聯呼叫:相反,你必須使用xxxPointer呼叫一次傳遞整個座標緩衝區,然後使用DrawArrays(選擇連續的子陣列)或DrawElements(透過索引選擇單個數組元素)繪製它們。
  • 只有 2D 紋理,沒有 3D 或 1D 紋理。
  • 不支援除三角形以外的多邊形。
  • ES 添加了以定點值(帶有x字尾的呼叫)而不是浮點數(帶有f字尾的呼叫)指定座標等的選項。

android.openglkhronos.opengles

[edit | edit source]

Android 提供了兩種替代的 OpenGL API 呼叫方式:khronos.opengles 呼叫是顯式GL物件的 off 方法呼叫,而 android.opengl 呼叫都是靜態的,並且隱式地引用當前的 GL 上下文。

看起來後者現在是首選形式,因為 API 級別 8(Android 2.2)中添加了對 OpenGL-ES 2.0 的支援,只在android.opengl樣式中完成,而不是在khronos.opengles樣式中完成。

OpenGL-ES 1.x 與 2.0

[edit | edit source]

Android 2.2 引入了對 OpenGL-ES 2.0 的支援,它與 OpenGL-ES 1.1 或 1.0 不向後相容。但是,OpenGL-ES 1.x API 仍然可用於現有程式碼。當你編寫新程式碼時,你需要決定使用哪一個。

主要區別在於 OpenGL-ES 2.0 不再支援固定功能管道。 也就是說,所有傳統的 OpenGL 材質、光照和矩陣函式都不可用了(這些函式在較新的 OpenGL 版本中也被棄用)。 代替它們,您可以編寫自定義的頂點著色器片段著色器,讓您完全控制材質、光照和變換的工作方式。

EGL 是一個 API,用於直接控制渲染到螢幕視窗、離屏畫素圖或其他顯示卡記憶體的 OpenGL 上下文的建立。 GLSurfaceView 提供了一個簡單的包裝器來避免您直接使用它,但您仍然可以在此不夠靈活的情況下使用它(例如,當您想要進行離屏渲染時)。

另請參閱

[編輯 | 編輯原始碼]

khronos.org(有關 OpenGL、OpenGL-ES 和 EGL 的文件)

應用內計費

[編輯 | 編輯原始碼]

一些開發者使用 Android 應用內計費 API 來銷售照片和其他媒體檔案、遊戲關卡和高階服務。

Android 應用內計費 API 使用與在 Google Play 中購買應用相同的後端。

Google Play 處理結賬詳情,因此應用程式從未直接處理任何財務交易 - 因此單個應用程式無需處理 PA-DSS 要求,包括 PCI DSS 要求。

Android 應用內計費 API 支援自動計費迴圈訂閱的免費試用期。

其他開發者使用 Stripe 或 PayPal 進行計費。

另請參見

[編輯 | 編輯原始碼]

無特定順序

"Android 應用內計費 Phonegap 1.0" [1]

"Android 應用內購買與 Phonegap" [2]

"回撥應用內計費外掛" [3]

"Google Play for Developers: 訂閱或迴圈收費" [4]

"Google Play 應用內計費:訂閱" [5]

"Android 計費庫:簡化應用內計費" [6]

"Android 應用內計費教程" http://stackoverflow.com/questions/8735931/android-in-app-billing-tutorial

"簡單的應用內計費/支付教程" [7]

"開始使用 Android 應用內計費" [8]

"Android GitHub 上的流行 API" [9]

華夏公益教科書