手机影音第十天,控制屏幕上下滑动改变音量变化,监听物理键改变音量
2017-07-21 21:24
555 查看
代码已托管至码云上,有兴趣的小伙伴可以下载看看,IDE是Android studio 2.3.2
https://git.oschina.net/joy_yuan/MobilePlayer 常见的手机播放器,都有屏幕上下滑动改变音量大小的功能,在此也实现下:
原理是:
1、从手指触碰屏幕,到离开屏幕,计算滑动的高度差,然后拿这个高度差与屏幕的高对比,最后结合总音量,得到改变的音量,具体的公式如下 :
改变的音量=(滑动距离差/屏幕总高度)*总音量
结束滑动后的音量=触碰屏幕时的音量+改变的音量
根据这个来改变音量与seekbar的显示进度
2、在手指触碰到屏幕时,会回调onTouchEvent方法,在这个方法里,有个参数event,这个参数可以获取到手指是上滑还是下滑
3、当手指一触碰屏幕,此时从event.getY()获取开始滑动时的Y轴值,并获取此时的声音值
4、当手指离开屏幕时,根据event.getY()获取离开时的Y轴值,前面的Y轴值-这时的Y轴值,就得到距离
5、根据上面的算法获取接收后的音量,然后设置对应的音量与seekbar进度即可.
具体代码如下:
同时Android的物理键也有增大、减小音量的功能,那么在这里也需要监听下物理键的回调方法,来改变音量大小以及seekbar的进度条
https://git.oschina.net/joy_yuan/MobilePlayer 常见的手机播放器,都有屏幕上下滑动改变音量大小的功能,在此也实现下:
原理是:
1、从手指触碰屏幕,到离开屏幕,计算滑动的高度差,然后拿这个高度差与屏幕的高对比,最后结合总音量,得到改变的音量,具体的公式如下 :
改变的音量=(滑动距离差/屏幕总高度)*总音量
结束滑动后的音量=触碰屏幕时的音量+改变的音量
根据这个来改变音量与seekbar的显示进度
2、在手指触碰到屏幕时,会回调onTouchEvent方法,在这个方法里,有个参数event,这个参数可以获取到手指是上滑还是下滑
3、当手指一触碰屏幕,此时从event.getY()获取开始滑动时的Y轴值,并获取此时的声音值
4、当手指离开屏幕时,根据event.getY()获取离开时的Y轴值,前面的Y轴值-这时的Y轴值,就得到距离
5、根据上面的算法获取接收后的音量,然后设置对应的音量与seekbar进度即可.
具体代码如下:
private float startY; //在屏幕上滑动调节音量时,开始的Y轴值 private float touchRange; //屏幕的高,因为涉及到横竖屏切换,到时候会取小的值 private int touchVoice; //滑动时的音量 //利用onTouchEvent,传递event事件给手势识别器,否则无法触发手势识别器的回调方法 @Override public boolean onTouchEvent(MotionEvent event) { dector.onTouchEvent(event); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: startY=event.getY(); currentVoice=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); //获取滑动开始时的音量 touchRange=Math.min(screenHeight,screenWidth); handler.removeMessages(HIDEVIDEO); break; case MotionEvent.ACTION_MOVE: float endY=event.getY(); //滑动的距离 float distance=startY-endY; //相对滑动的距离 //float changeVoice=(distance/touchRange)*maxVoice; //改变的音量 Log.i(TAG, "onTouchEvent: move里改变的距离"+distance); //int voice= (int) Math.min(Math.max(touchVoice+changeVoice,0),maxVoice); //改变后的音量 // if (changeVoice!=0){ //当改变的音量不为0时,才去改变音量 // setVoice(voice,false); // } break; case MotionEvent.ACTION_UP: float upY=event.getY(); float upDistance=startY-upY; float changeVoice=(upDistance/touchRange)*maxVoice; //改变的音量 Log.i(TAG, "onTouchEvent: 取消滑动时的距离"+upDistance); int voice= (int) Math.min(Math.max(touchVoice+changeVoice,0),maxVoice); //改变后的音量 if (changeVoice!=0){ //当改变的音量不为0时,才去改变音量 setVoice(voice,false); } handler.sendEmptyMessageDelayed(HIDEVIDEO,3000); break; } return super.onTouchEvent(event); }
同时Android的物理键也有增大、减小音量的功能,那么在这里也需要监听下物理键的回调方法,来改变音量大小以及seekbar的进度条
/** * 当按手机的增加音量、减少音量时,相应的改变音量与进度条 * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode==KeyEvent.KEYCODE_VOLUME_DOWN){ currentVoice--; setVoice(currentVoice,false); handler.removeMessages(HIDEVIDEO); handler.sendEmptyMessageDelayed(HIDEVIDEO,3000); return true; }else if (keyCode==KeyEvent.KEYCODE_VOLUME_UP){ currentVoice++; setVoice(currentVoice,false); handler.removeMessages(HIDEVIDEO); handler.sendEmptyMessageDelayed(HIDEVIDEO,3000); return true; //如果返回false,那么seekbar变化,同时系统的音量条也会出现,不好看。 } return super.onKeyDown(keyCode, event); }
相关文章推荐
- Android工具之实现上下滑动屏幕控制音量,同时绑定物理键
- 通过ImageView的点击监听事件来滑动ScrollView的滚动条,进而改变屏幕显示内容
- js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- iOS开发 - 滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
- iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)
- Android初学习 - 在Activity中监听屏幕属性改变用来控制是否全屏(隐去status bar)
- Android中 视频屏幕左半部分上下滑动改变亮度右半部分上下滑动改变声音
- 视频屏幕左半部分上下滑动改变亮度,右半部分上下滑动改变声音
- js控制元素显示在屏幕固定位置,监听屏幕高度变化
- js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
- Android下ListView上下滑动背景颜色改变
- RecycleView实现左右滑动监听和上下拖拽调换顺序
- SuperPlayer 是一个基于 IjkPlayer 的控制器,支持手势操作,滑动快进,快退,支持,上滑音量亮度的变化,支持指点位置播放,播放源的切换
- 监听输入框值变化的最佳方案 oninput 和 onpropertychange (实时监控文本框改变的最佳方案)
- 滑动调节音量与屏幕亮度
- iOS 上下滑动tableView导航透明度逐渐改变
- Android监测手指上下左右滑动屏幕
- iOS 监听App音量的变化(转)
- 通过滑动条控制iPhone音量的代码