【问题标题】:GUI Development (in Android)GUI 开发(在 Android 中)
【发布时间】:2014-11-15 03:24:48
【问题描述】:

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

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

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

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

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

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

我遇到的这些问题不仅仅是针对 Android 的,我确信在 Windows 应用程序开发中也使用了相同的更新挂钟应用程序的方法,所以我觉得我是否对 GUI 开发有很好的理解,而不管环境,我也许可以轻松解决这些愚蠢的问题;也许你也可以指导我看一本关于 Java 或 C/C++ 的 GUI 开发的好书。

【问题讨论】:

    标签: android eclipse visual-studio user-interface


    【解决方案1】:

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

    我对音频条知之甚少,但它会以类似的方式工作。制定一个公式来计算栏应该在哪里/有多大。然后画一条延伸到公式规定的条形图。

    【讨论】:

      【解决方案2】:

      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 编程中应用 OOP 概念。例如,您可以将要绘制的每件东西定义为实现通用绘制方法的对象。这在 3D 游戏编程中被广泛使用,因为通常 3D 渲染引擎会管理每个对象,并在“相机”看到它们时要求它们绘制自己。

      什么时候画?

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

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

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

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

      要记住的事情

      重用操作系统为您提供的小部件是个好主意。只需使用进度条即可实现分贝计。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2012-11-19
        相关资源
        最近更新 更多