跳转到内容

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]

华夏公益教科书