2014-09-20 59 views
0

我来自非GUI和更低级别的编程环境。我在OOP编程和算法方面有丰富的经验,但我所从事的项目没有任何令人印象深刻的用户界面,因此我的职位在这里。GUI开发(在Android中)

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

例如,让我们以经典挂钟为例,介绍第二,分钟和小时手臂。挂钟应用程序将每秒钟移动秒针,每个60分钟的小时手臂,每60秒分钟的手臂,我遇到的问题是我无法用有效的方式围绕创建这些移动部件。

我是否应该保存所有可能的秒,分和小时组合的图像,并且只是将3变形并每秒显示适当的时间?或者将背景图像作为一个非动态实体,并且只有“秒,分和小时”手臂旋转是更好的主意?如果是这样的话,当我打包我的应用程序时,我还必须包含60 + 60 + 12 = 132张图片(秒为60张图片,数小时为12张图片,分钟为60张图片),这是正确的吗?如果是这样,这似乎是非常低效......

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

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

这些问题我不只是Android的具体问题,我敢肯定,在Windows应用程序开发中也使用了更新壁钟应用程序的相同方法,所以我觉得如果我对GUI开发有很好的理解,而不考虑环境,我可以轻松解决这些愚蠢的问题;也许你也可以指导我写一本关于Java或C/C++ GUI开发的好书。

回答

0

对于你的时钟的例子:你不会生成时钟可能在每个位置的图像。你的应用程序将是巨大的!您将改为为时钟,分针,时针和秒针创建图像。然后,您可以花时间从时钟上的某个标准点(这可能是您想要的任何点)计算时钟每一只手的角度。然后,您可以将每个图像旋转到该计算量。这将使时钟看起来有双手指向正确的时间。

我不太了解音频栏,但它可以以类似的方式工作。制定一个公式来计算酒吧应该在哪里/多大。然后画出一条延伸到公式规定的条。

0

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

如何画?

例如,如果要显示漫画角色走路,大多数情况下需要将每个帧存储为图像并重新绘制,可能在每个刻度或秒钟。

但挂钟,你实际上并不需要

  • 商店每一种可能性那么多的图像,因为你可以把单箭头的图像,并将其旋转
  • 存储任何图像可言,如果你能通过定义其形状来程序化地绘制它

假设您在画架上有一个画布,您可以在其上绘制任何您想要的画布。您可以选择要绘制的订单。以你的挂钟为例,你可以先画出你的背景(数字/小时),然后开始在它上面添加分针和时针。这被称为z顺序。

操作系统库为您提供了可与之交互的小部件。帆布(图片框)就是其中之一,你可以画任何你想要的,你建立自己的自定义小部件,当然Android has this too.

Android有Views每个视图提供您可以实现自定义绘制逻辑的方法:

// Implement this to do your drawing. 
// Parameters 
// canvas the canvas on which the background will be drawn 
protected void onDraw (Canvas canvas){} 

一种非常原始的挂钟可以只使用来实现:

canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 

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

什么时候画?

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

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

但并不是每个环境都很容易。例如,您的应用程序可能需要每秒重绘本身30次,并且取决于操作系统和环境,您可能需要获取锁以正确显示UI更新,并且可能需要让线程进入睡眠状态以达到所需的帧速率,而不会使CPU保持繁忙。 (这用于SDL库。)

Android有一个animation class来解决常见任务。

一点要记住

重用小部件的操作系统给你是一个好主意。您只需使用进度条即可实现dB测量仪表。