2009-08-19 69 views
3

我是创造这种基于钢琴的UI应用程序的新手。 我正在开发一个应用程序,我必须使用钢琴。 如何在iPhone中创建钢琴用户界面? 如何使用Interface Builder创建它?或者还有其他方式来创作钢琴吗?如何在Iphone中创建钢琴用户界面?

我迫切需要创建这样的用户界面,如果任何机构有任何解决方案或任何有用的代码或任何链接,这将不胜感激。

感谢, 尼拉吉

回答

9

1版易于编码,不那么优雅。

在xcode中启动一个基于视图的项目,并使用界面编辑器编辑MyProjectViewController.xib,将一系列类似于屏幕键盘的形状和颜色的按钮放在一起。

编辑MyProjectViewController.h.m添加了一堆方法与签名是这样的:

- (IBAction) playMiddleC: (id) sender; 
- (IBAction) playMiddleD: (id) sender; 
- (IBAction) playMiddleE: (id) sender; 

现在,你可以回到界面生成器,并用鼠标右键单击并拖动每个按钮到文件的所有者对象(中类型MyProjectViewController)。当你这样做时,会弹出一个菜单,询问用哪种方法附加按钮 - 为该按钮选择合适的方法。

现在为您想要播放的每个键添加声音文件。例如,假设你有一个叫做midC.caf文件(比如说,线性PCM格式编码,作为the valid sound file formats之一)。将该文件复制到项目目录中,然后右键单击(在xcode中)Resources文件夹,然后选择“添加”>“现有文件”,然后选择声音文件,将该文件添加到项目中。

接下来,您需要添加AudioToolbox库作为依赖项。通过右键单击Frameworks文件夹并选择Add> Existing Frameworks ..然后浏览AudioToolbox库并选择它。

与此同时,在MyProjectViewController.m,添加如下代码:

#import <AudioToolbox/AudioServices.h> 

// (Later...) 

- (IBAction) playMiddleC: (id) sender { 
    NSString* path = [[NSBundle mainBundle] 
        pathForResource:@"midC" ofType:@"caf"]; 
    NSURL* url = [NSURL URLWithString:path]; 
    SystemSoundID midC; 
    AudioServicesCreateSystemSoundID((CFURLRef)url, &midC); 
    AudioServicesPlaySystemSound(midC); 
} 

打命令,输入编译和运行,使一些音乐!

版本2略显优雅。

以编程方式构建一个键盘UI,其中一个数组用于白键,另一个用于黑色(因为它们将具有略微不同的坐标)。我建议使用定制UIButton类型和每个键类型的压制和nonpressed版本(黑色,C/F,B/E,和A/d/G,其是中间白键 - 我帐户键缩进这里)图像。

这将允许您将指向这些按钮的指针存储在数组中,并且可以通过将声音ID存储在相应阵列中的方法来为任何按键播放声音。

你可能会认为你想以编程方式创建声音,因为它们本质上有点数学性。但AudioQueue服务,你会用这样做,是显著更多的工作来处理比上面的代码,所以其实我建议只用声音字节,即使是在一个“优雅”的版本。无论如何,它甚至可能听起来更好。

顺便说一句,你的问题听起来像你正在考虑这是一个快速和简单的初学者应用程序,但我不太确定。学习开发iPhone应用程序很有趣,但需要花费一些时间和精力才能做好。如果您对初学者应用的想法感兴趣,我建议您一次寻找能够锻炼一种新编程技能的东西,例如学习如何使用无处不在的UITableView,或者是一个可让您拍照并附加它的快速应用以电子邮件为例(这很容易,因为iPhone SDK对照片拍摄和电子邮件撰写有很大的支持)。

玩得开心!

+1

鉴于他说他有迫切的需求,我不认为他是做这个初学者的应用程序来学习或玩乐。我猜想有人已经为他分配了任务去创建一个钢琴应用程序。可能有人在营销中说:“嘿,它有多难?我听说人们在短短几天内就开发了应用程序,Niraj很聪明,我相信他可以在更短的时间内做到这一点!” :-) – mahboudz 2009-08-19 07:53:51

+0

如果我不得不考虑一个优秀的钢琴应用程序所涉及的工作,包括让图形看起来不错,以便在关键点击时使用漂亮的声音,我估计不会少于3个月,可能还有6个月,从开始到测试版(如果单独的程序员将其作为他们的第一个iPhone应用程序这样做的话,这是双倍的)。例如,回放一个小的声音片段是一回事,但为了无限期地回放以获得对音符的良好保持,这是完全不同的(ADSR信封:http://en.wikipedia.org/wiki/ ADSR_envelope)。 – mahboudz 2009-08-19 08:01:02

+0

好点,mahboudz。我同意做好这件事需要更长的时间。此外,感谢您添加ADSR的想法和链接。 – Tyler 2009-08-19 19:49:38

1

一种方法是拍摄钢琴键盘的照片并将图像作为起点。

另一种方法是在Photoshop或其他应用程序中,在默认和按键位置绘制按键,并将其用作基准。

在App Store上进行搜索,并查看钢琴键盘已实施的不同方式。有一些,有些看起来比其他人更现实。

做一个钢琴键盘的好表现并不容易,尤其是如果你试图通过动画获得光滑的外观和创造逼真的动作,但它是可行的。至少,你应该研究Quartz 2D和可能的一些CAAnimation。

2

感谢您的回复...

我几乎完成了开发用户界面的钢琴。

我已经使用编程方法来创建黑白键。

CGFloat buttonWhitePosX = 2.0; //white button start position 
for(int i=0;i<8;i++){ //8 keys in one octave 
    CGFloat buttonWhitePosY = 105; 
    CGFloat buttonWhiteWidth = 57; 
    CGFloat buttonWhiteHeight = 190; 

    UIButton *buttonWhite = [[UIButton alloc] initWithFrame:CGRectMake(buttonWhitePosX, buttonWhitePosY, buttonWhiteWidth, buttonWhiteHeight)]; 
    buttonWhitePosX = buttonWhitePosX + WHITE_BUTTON_SPACE + buttonWhiteWidth; 
    [buttonWhite setBackgroundImage:whiteImage forState:UIControlStateNormal]; 
    [buttonWhite addTarget:self action:@selector(pressButtonWhiteTouchDown:) forControlEvents:UIControlEventTouchDown]; 

    buttonWhite.tag = i; 
    [buttonWhite setBackgroundImage:whiteImageHighlighed forState:UIControlEventTouchDragInside]; 
    [self.view addSubview:buttonWhite]; 
    [buttonWhite release]; 

} 

对于使用不同坐标的黑键的相同方式。

而且我能够在关键播放声音压制使用AVPlayer。(对选择触落)

到目前为止好,但是当用户滑过琴键,钢琴应该发挥尊重的声音。

为了实现这一目标是试图与

1)用于UIControl事件的UIButton。拖动Enter,拖出,拖入里面。 但它不会给我正好按下该按钮, 拖累出口位置是用来绘制按钮

2)的touchesBegan,touchesEnded,主视图的touchesMoved(其中黑键和白键都放在外面的方式)。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchLocation = [touch locationInView:touch.view]; 
    currentView = [self.view hitTest:touchLocation withEvent:nil]; //get top view 
    if(currentView != self.view){ //check current view is main view, do nothing 
     if(currentView == prevView){ //check current view is prev view, keep highlight image 
      currentView.backgroundColor = [UIColor colorWithPatternImage:whiteImageHighlighed]; 
     }else{ //view changed, change image and play sound 
      prevView.backgroundColor = [UIColor colorWithPatternImage:whiteImage]; 
      currentView.backgroundColor = [UIColor colorWithPatternImage:whiteImageHighlighed]; 
      [self pressButtonWhiteDown1:currentView.tag]; 
      prevView = currentView; 
     } 
    } 
} 

在该方法中它给出错误的视图当白键用户滑动并遇到黑键的X位置(如黑键是在主视图中的白键的顶部):

alt text http://img215.yfrog.com/img215/1720/pianohelp.png

是否有任何其他方法或我在做错的事情。请指导我。

是否有可能从触摸点获得准确的视图?

谢谢。

+0

终于我设法让我的钢琴UI工作。谢谢您的帮助。 – Niraj 2009-09-01 04:25:38

+0

我现在正在这样做,与你同样的问题。解决方案是什么? – iPadDeveloper2011 2011-04-28 06:36:48

0

我做了一件非常相似的事情。我用正常的按钮与圆角,并使他们每个人发挥WAV声音。它很好用!