您的位置:首页 > 其它

手机影音第十天,控制屏幕上下滑动改变音量变化,监听物理键改变音量

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进度即可.

具体代码如下:

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐