我来自非GUI和低级编程环境。我在OOP编程和算法方面有丰富的经验,但我工作的项目没有任何令人印象深刻的用户界面,因此我的帖子在这里。
我想了解如何在移动应用中更新图形。
例如,让我们来看一个经典挂钟的基本例子,包括秒针,分钟针和小时针。挂钟应用程序将每秒移动秒针臂,同样每小时臂移动60分钟,每60秒移动几分钟,我遇到的问题是我无法以高效的方式围绕创建这些移动部件。
我是否应该保存所有可能的秒,分和小时组合的图像,只需变形3并每秒显示适当的时间?或者将背景图像作为非动态实体并且只有“秒,分钟和小时”的手臂旋转是一个更好的主意?如果是这种情况,当我打包我的应用程序时,我还必须包括60 + 60 + 12 = 132张图像(60张图像秒,12张图片表示小时,60张图像表示分钟),这是正确的吗?如果是的话,这看起来非常低效......
为了让您了解我遇到的问题,请考虑另一个需要在每次麦克风听到不同噪音水平时更新图形的示例:假设我想创建一个测量声音水平的应用程序环境,它显示从音量条上的麦克风测量的dB。如果麦克风附近播放的歌曲有不同的噪音,则声级指示器将上下移动。我了解如何将噪声值更新到命令提示符,串行窗口或TextView框,但我不知道如何以图形方式更新此信息。
我可能错了,但我想我必须有一个空的音量条图像(好像噪音是零),并且在程序中,我根据从麦克风获得的dB级别填充此音量条,但是,如何根据麦克风看到的噪音水平实时填充音量条?
我所遇到的这些问题不仅仅是针对Android的问题,我确信更新Wall Clock应用程序的方法也适用于Windows应用程序开发,所以我觉得如果我对GUI开发有很好的理解,不管是在环境方面,我或许能够轻松解决这些愚蠢的问题;也许你也可以指导我阅读一本关于Java或C / C ++ GUI开发的好书。
答案 0 :(得分:0)
对于你的时钟示例:你不会为时钟所在的每个位置生成图像。你的应用程序将是巨大的!您可以改为制作图像:时钟,分针,时针和秒针。然后,您可以花时间从时钟上的某个标准点计算时钟每只手的角度(这可能是您想要的任何点)。然后,您可以将每个图像旋转到该计算量。这将使时钟看起来像是指向正确的时间。
我不太了解音频条,但它会以类似的方式工作。制定一个公式来计算条形应该在哪里/有多大。然后绘制一个拉伸到公式所规定的条形。
答案 1 :(得分: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编程中应用OOP概念。例如,您可以将要绘制的每个事物定义为实现常用绘图方法的对象。这被广泛用于3D游戏编程,因为通常3D渲染引擎管理每个对象并要求他们绘制自己,如果"相机"看到他们。
何时开始?
通常这取决于操作系统。它可以在需要时绘制元素。但是,对于类似游戏的应用程序和自定义动画,您可能需要自己管理它。
在大多数操作系统上,您可以使用单独的线程,计时器,无限循环或通知事件来强制重绘屏幕。您可以在Android上使用postInvalidate方法重绘此内容。
但不是每个环境都很容易。例如,您的应用程序可能需要每秒重绘30次,并且根据操作系统和环境,您可能需要获取锁以正确显示UI更新,并且可能需要使线程休眠以实现所需的帧速率而不会使CPU忙。 (这在SDL库中使用。)
Android有animation class来处理常见任务。
要记住
重用OS给你的小部件是一个好主意。您只需使用进度条即可实现dB仪表。