美文网首页
如何为我们的app各种事件增加震动反馈

如何为我们的app各种事件增加震动反馈

作者: 跃文 | 来源:发表于2019-05-17 09:51 被阅读0次

第一种方法

1. 利用<AudioToolbox>框架完成

AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:

  • 播放短的声音文件(支持振动)
  • 你可以用它来播放一个短的声音(30秒以下)
  • 这个接口不支持等级,位置,循环,时间的控制,同时播放功能。在同一时间,你只能播放一个声音。
    -----------注意:数据必须是PCM或者IMA4格式
    -----------注意:音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)

具有震动效果的函数有两个:
void AudioServicesPlayAlertSound ( SystemSoundID inSystemSoundID );
void AudioServicesPlaySystemSound ( SystemSoundID inSystemSoundID );
注:方法在iOS2.0后开始可以使用,在这个框架中还有许多其他的回馈方法可以自行尝试。

  • 系统自带效果示例 :
// `Peek` 震动反馈 (weak boom)
    AudioServicesPlaySystemSound(1519);

// `Pop` 震动反馈 (strong boom)
    AudioServicesPlaySystemSound(1520);
// 
    AudioServicesPlaySystemSound(1521);

CF_ENUM(OSStatus)
{
    kAudioServicesNoError                                   =  0,
    kAudioServicesUnsupportedPropertyError                  = 'pty?',
    kAudioServicesBadPropertySizeError                      = '!siz',
    kAudioServicesBadSpecifierSizeError                     = '!spc',

    kAudioServicesSystemSoundUnspecifiedError               = -1500,
    kAudioServicesSystemSoundClientTimedOutError            = -1501,
    kAudioServicesSystemSoundExceededMaximumDurationError   = -1502
};
// 可以尝试其他数值我试过例如1000、1005会有长震动效果
  • 2 我们也可以自定义播放一些字及的声音震动效果
    主要涉及函数
    • 创建对象:
      OSStatus AudioServicesCreateSystemSoundID ( CFURLRef __nonnull inFileURL,SystemSoundID * __nonnull outSystemSoundID );

    • 销毁对象:
      OSStatus AudioServicesDisposeSystemSoundID ( SystemSoundID inSystemSoundID);

    • 播放声音:(一共2个)
      带有振动效果的播放:
      void AudioServicesPlayAlertSound ( SystemSoundID inSystemSoundID );
      void AudioServicesPlaySystemSound ( SystemSoundID inSystemSoundID );

    • 播放完成之后执行的操作:(其中弟四个参数是一个C语言的函数)
      OSStatus AudioServicesAddSystemSoundCompletion ( SystemSoundIDinSystemSoundID, CFRunLoopRef __nullable inRunLoop, CFStringRef __nullableinRunLoopMode, AudioServicesSystemSoundCompletionProc __nonnullinCompletionRoutine, void * __nullable inClientData );

具体使用示例:

- (void)playSoundAndShake {
//1.获得音效文件的全路径
    NSURL *url=[[NSBundle mainBundle] URLForResource:@"*****.wav" withExtension:nil];
//2.加载音效文件,创建音效ID(SoundID,一个ID对应一个音效文件)
  SystemSoundID soundID = 12345;
  AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &soundID);
// 完成播放之后执行的soundCompleteCallback函数
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);
//3.播放音效文件
//下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果
    AudioServicesPlayAlertSound(soundID);
    //AudioServicesPlaySystemSound(<#SystemSoundID inSystemSoundID#>)
}
#pragma mark - 播放完成之后执行的函数
void soundCompleteCallback()
{
    NSLog(@"播放完成");
}

- (void)deallocSound:(SystemSoundID) soundID {
//把需要销毁的音效文件的 soundID 传递给它既可销毁
    //AudioServicesDisposeSystemSoundID(soundID);
}
2. 利用<UIKit>框架的“UIImpactFeedbackGenerator”类完成

在查看系统 API 时你会发现类名前标注着UIKIT_CLASS_AVAILABLE_IOS_ONLY(10_0)这个类是在iOS10之后才可用
使用示例:

    UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] initWithStyle: UIImpactFeedbackStyleLight];
    [generator prepare];
    [generator impactOccurred];

其中涉及枚举很容易理解

typedef NS_ENUM(NSInteger, UIImpactFeedbackStyle) {
    UIImpactFeedbackStyleLight,
    UIImpactFeedbackStyleMedium,
    UIImpactFeedbackStyleHeavy
};

sssssssss

相关文章

  • 如何为我们的app各种事件增加震动反馈

    第一种方法 1. 利用框架完成 AudioToolbox.framework是一套基于...

  • MJRefresh增加震动反馈

    MJRefresh增加震动反馈 发现有的app在下拉刷新的时候有一下震动反馈,感觉用户体验很棒,所以想在现有的项目...

  • 系统震动or震动反馈

    一.系统震动 1.AudioServicesPlaySystemSound() 系统震动是在iOS10.0之前存在...

  • iOS 震动反馈(UIFeedbackGenerator)和系统

    震动反馈(UIFeedbackGenerator) 震动反馈是iOS 10之后出的新特性,相比于之前的系统震动Au...

  • Android 高版本中无法在后台震动 Ignoring inc

    有用户反馈在Android 10上,app到后台之后无法震动,调试后发现有一行红色的提示 调用震动的代码是这样: ...

  • Runloop初识

    一、作用: 1.保证程序持续运行 处理APP中的各种事件(如触摸事件、定时器事件、Selector事件) 节约cu...

  • RunLoop

    基础知识 作用 保持程序持续运行 处理app中的各种事件(如触摸事件、定时器事件【NSTimer】、selecto...

  • iOS 震动反馈

    http://zhoulingyu.com/2017/01/16/iOS——关于-Taptic-Engine-震动反馈/

  • iOS震动反馈

    长震动 支持iPhone基本机型,支持iOS9注:用户在“系统设置”中关闭了振动功能,此震动会失效。 短震动一 支...

  • iOS震动反馈

    之前的手机系统要用到的震动接口是AudioServicesPlaySystemSound,但这个震动幅度比较大,如...

网友评论

      本文标题:如何为我们的app各种事件增加震动反馈

      本文链接:https://www.haomeiwen.com/subject/jkfnaqtx.html