首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GUI开发(在Android中)

GUI开发(在Android中)
EN

Stack Overflow用户
提问于 2014-09-21 03:21:16
回答 2查看 227关注 0票数 0

我来自一个非图形用户界面和低级编程环境。我在OOP编程和算法方面有扎实的经验,但我所从事的项目没有任何令人印象深刻的用户界面,因此我在这里发表了这篇文章。

我想了解图形是如何在移动应用程序中更新的。

例如,让我们以一个经典的挂钟为例,它有秒针、分针和时针。挂钟应用程序会每秒移动秒针,同样,小时针每60分钟移动一次,分钟针每60秒移动一次,我的问题是我无法高效地创建这些移动部件。

我是否应该保存秒、分钟和小时的所有可能组合的图像,然后将3变形并每秒显示适当的时间?或者,让背景图像作为非动态实体,只旋转“秒、分、小时”的手臂是更好的主意吗?如果是这种情况,当我打包我的应用程序时,我将不得不包括60 + 60 + 12 = 132张图片(60张图片用于秒,12张图片用于小时,60张图片用于分钟),这是正确的吗?如果是,这似乎是非常低效的.

为了让你对我的问题有所了解,考虑另一个例子,它需要在麦克风每次听到不同的噪声水平时更新图形:假设我想要创建一个应用程序来测量环境中的声音水平,它在音量栏上显示从麦克风测量的dB。如果麦克风附近播放的歌曲有不同的噪音,则声级指示器将上下移动。我知道如何在命令提示符、串行窗口或TextView框中更新噪声值,但我不知道如何以图形方式更新此信息。

我可能错了,但我认为我必须有一个音量条图像是空的(就像噪音为零一样),并且在程序中,我根据从麦克风获取的dB级别填充这个音量条,但是我如何根据麦克风看到的噪声级别实时填充音量条?

我的这些问题不仅仅是Android特有的,我确信Windows应用程序开发中也使用了更新挂钟应用程序的相同方法,所以我觉得如果我对GUI开发有很好的理解,而不管环境如何,我也许能够轻松地解决这些愚蠢的问题;也许您还可以指导我阅读一本关于用Java或C/C++进行GUI开发的好书。

EN

回答 2

Stack Overflow用户

发布于 2014-09-21 04:10:57

对于时钟示例:您不会为时钟可能所在的每个位置生成图像。你的应用程序将是巨大的!相反,您将为以下对象制作图像:钟面、分针、时针和秒针。然后,您可以利用时间,从时钟上的某个标准点(可以是您想要的任何点)计算时钟每根指针的角度。然后,您可以将每个图像旋转到该计算量。这将使时钟看起来指针指向正确的时间。

我对音频栏不是很了解,但它的工作方式与此类似。制作一个公式来计算条形应该在哪里/多大。然后绘制一个条形图,将其拉伸到公式所指定的位置。

票数 0
EN

Stack Overflow用户

发布于 2014-09-21 04:21:50

GUI和自定义绘图可以通过许多不同的方式实现,每种方式都有不同的效率。

怎么画?

例如,如果您想要显示一个行走的卡通人物,在大多数情况下,您需要将每个帧存储为图像并重绘它,可能是在每个刻度或每秒。

但是对于挂钟来说,你实际上不需要

  • 存储多种图像,因为您可以放置单箭头图像并对其进行旋转
  • 如果您可以通过定义shape

以程序方式绘制图像,则可以存储任何图像

假设你在画架上有一张画布,你可以在上面画任何你想画的东西。您可以选择要绘制的顺序。对于您的挂钟示例,您可以首先绘制您的背景(数字/小时),并开始在其上添加分针和时针。这就是所谓的z顺序。

操作系统库为您提供了可以与之交互的小部件。Canvas (图片框)就是其中之一,您可以绘制您想要的任何内容来构建您的自定义小部件,当然还有Android has this too.

安卓有Views,每个视图都提供了一个方法,你可以用它来实现你的自定义绘制逻辑:

代码语言:javascript
运行
复制
// Implement this to do your drawing.
// Parameters
// canvas   the canvas on which the background will be drawn
protected void onDraw (Canvas canvas){}

一个非常粗糙的挂钟可以通过使用以下命令来实现:

代码语言:javascript
运行
复制
canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

除此之外,我们基本上也可以在GUI编程中应用OOP概念。例如,您可以将要绘制的每个对象定义为实现公共绘制方法的对象。这在3D游戏编程中被广泛使用,因为通常3D渲染引擎管理每个对象,并要求它们在“相机”看到它们时绘制自己。

何时绘制?

通常,这取决于操作系统。它在需要的时候绘制元素。但是,对于游戏应用程序和自定义动画,您可能需要自己管理这一点。

在大多数操作系统上,您可以使用单独的线程、计时器、无限循环或通知事件来强制重新绘制屏幕。您可以在Android上使用postInvalidate方法来实现此重绘。

但并不是每个环境都很容易。例如,您的应用程序可能需要每秒重新绘制30次,并且根据操作系统和环境的不同,您可能需要获取锁以正确显示UI更新,并且可能需要使线程休眠以在不使CPU繁忙的情况下达到所需的帧率。(这在SDL库中使用。)

Android有一个animation class来处理常见的任务。

要记住的事情

重用操作系统提供的小部件是一个好主意。您可以只使用进度条来实现dB计量器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25952447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档