現(xiàn)在App視頻之中常用到手勢滑動來控制音量及屏幕亮度阴挣,簡單實現(xiàn)下
既然是滑動控制,那么需要知道滑動的方向纺腊,一般左邊上下滑動為亮度畔咧,右邊上下滑動為音量茎芭,左右滑動為快進快推。
在最開始的時候先導入頭文件誓沸,才能使用MPVolumeView
#import <MediaPlayer/MediaPlayer.h>
首先來定義一個枚舉來判斷滑動方向
// 枚舉值梅桩,包含水平移動方向和垂直移動方向
typedef NS_ENUM(NSInteger, PanDirection){
PanDirectionHorizontalMoved, // 橫向移動
PanDirectionVerticalMoved // 縱向移動
};
在屬性這邊
@property (nonatomic,strong) UIPanGestureRecognizer* panGes; //控制音量及亮度手勢
@property (nonatomic, assign) PanDirection panDirection; //定義枚舉變量
@property (nonatomic, strong) UISlider *volumeViewSlider; //調(diào)節(jié)滑竿
@property (nonatomic, assign) BOOL isVolume; //是否在調(diào)節(jié)音量
定義完成后,先去獲取系統(tǒng)音量拜隧,當然順便把耳機的插拔狀態(tài)寫進去宿百,該方法在初始化播放器的時候直接self調(diào)用
/**
* 獲取系統(tǒng)音量
*/
- (void)setLightAndVolume
{
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
_volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
_volumeViewSlider = (UISlider *)view;
break;
}
}
// 監(jiān)聽耳機插入和拔掉通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mic:) name:AVAudioSessionRouteChangeNotification object:nil];
}
/**
* 耳機插入、拔出事件
*/
- (void)mic:(NSNotification*)notify
{
NSDictionary *dic = notify.userInfo;
NSInteger isEarPhone = [[dic valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (isEarPhone) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
// 耳機插入
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
{
// 拔掉耳機繼續(xù)播放
[self StartPlay];
}
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
break;
}
}
之后是對于手勢的添加洪添,在視頻未全屏播放的情況下垦页,不需要使用手勢去控制,所以在點擊全屏的時候去添加手勢(全屏按鈕點擊事件)干奢,在返回豎屏的時候釋放
-(void)fullScreenOrShrinkScreen:(UIButton*)sender
{
sender.selected = !sender.selected;
[self addControlVolmeAndLight:sender.selected];
if (_mjPlayerViewDelegate&&[_mjPlayerViewDelegate respondsToSelector:@selector(fullScreenOrShrinkScreenDelegate:)]) {
[_mjPlayerViewDelegate fullScreenOrShrinkScreenDelegate:sender];
}
}
#pragma Mark -- 添加手勢控制聲音及亮度
-(void)addControlVolmeAndLight:(BOOL)isLandscape
{
if (isLandscape) {
_panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(controlVolmeAndLight:)];
[self addGestureRecognizer:_panGes];
}else
{
[self removeGestureRecognizer:_panGes];
}
}
在添加完手勢后痊焊,就是對手勢進行處理,響應該手勢的事件忿峻,具體注釋在代碼中
#pragma Mark----滑動手勢響應事件
-(void)controlVolmeAndLight:(UIPanGestureRecognizer*)ges
{
//根據(jù)位置薄啥,確定是調(diào)音量還是亮度
CGPoint locationPoint = [ges locationInView:self];
// 獲取滑動速度
CGPoint speed = [ges velocityInView:self];
// 判斷是垂直移動還是水平移動
switch (ges.state) {
case UIGestureRecognizerStateBegan:{ // 開始移動
// 使用絕對值來判斷移動的方向
CGFloat x = fabs(speed.x);
CGFloat y = fabs(speed.y);
if (x < y){ // 垂直移動
self.panDirection = PanDirectionVerticalMoved;
// 開始滑動的時候,狀態(tài)改為正在控制音量
if (locationPoint.x > self.bounds.size.width / 2) {
self.isVolume = YES;
}else { // 狀態(tài)改為顯示亮度調(diào)節(jié)
self.isVolume = NO;
}
}
break;
}
case UIGestureRecognizerStateChanged:{ // 正在移動
switch (self.panDirection) {
case PanDirectionHorizontalMoved:{
//[self horizontalMoved:veloctyPoint.x]; // 水平移動的方法只要x方向的值
break;
}
case PanDirectionVerticalMoved:{
[self verticalMoved:speed.y]; // 垂直移動方法只要y方向的值
break;
}
default:
break;
}
break;
}
case UIGestureRecognizerStateEnded:{ // 移動停止
// 移動結(jié)束也需要判斷垂直或者平移
// 比如水平移動結(jié)束時,要快進到指定位置逛尚,如果這里沒有判斷垄惧,當我們調(diào)節(jié)音量完之后,會出現(xiàn)屏幕跳動的bug
switch (self.panDirection) {
case PanDirectionHorizontalMoved:{
break;
}
case PanDirectionVerticalMoved:{
// 垂直移動結(jié)束后绰寞,把狀態(tài)改為不再控制音量
self.isVolume = NO;
break;
}
default:
break;
}
break;
}
default:
break;
}
}
最后一步是調(diào)節(jié)方法(PS:亮度調(diào)節(jié)功能已有到逊,但是它的view要自定義,還沒加上)
- (void)verticalMoved:(CGFloat)value
{
//該value為手指的滑動速度克握,一般最快速度值不會超過10000蕾管,保證在0-1之間,往下滑為正菩暗,往上滑為負 所以用 “-=”
NSLog(@"%f",value);
if (self.isVolume) {
self.volumeViewSlider.value -= value / 10000;
}else
{
([UIScreen mainScreen].brightness -= value / 10000);
}
}
想到再加```````PS:該功能參考ZFPlayer
之后打算做亮度界面掰曾,再做做彈幕.
分割線------------------------------------------------------------------------------------------------------------------
未完待續(xù)..