Android/API 概述
以下是 Android API 中一些最重要的包命名空间和类的概述。
- android.content.Context 是 android.app.Activity 和其他类似类的基类。在这里你会找到访问应用程序包数据和应用程序环境的重要方法。
- android.view.View 是所有小部件的基类。android.view 命名空间定义了非小部件特定的实用程序类。
- android.widget 是你将找到特定小部件实现和相关类的命名空间。
- android.graphics 是 2D 图形 API 的命名空间;画布 是绘图上下文,画笔 指定设置,例如要使用什么颜色、绘图模式、文本设置等,以及 字体 是你如何指定字体。
- android.content.Intent 是基本的 IPC 机制。
- android.os 包含与 UI 框架相关的各种有用类:处理程序 用于将任务/消息馈送到 循环器,以及 异步任务 用于在需要与 UI 协调的后台线程上运行任务。在这里你还会找到 包裹 和 捆绑,它们是序列化/反序列化数据的不同方式,主要用于保存/恢复 UI 状态。
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 — 不确定这有什么意义。为什么要定义自己的时区?
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.opengl与khronos.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]