Android 手机影音 学习过程记录(四)

前一篇已经将视频播放页面的布局弄好了,这一篇主要来处理播放页面的各种逻辑(播放、暂停、上/下一个视频、音量、进度…),逻辑比较多,一点一点贴代码。

顶部布局的逻辑:

显示系统时间,时间是一秒一秒更新的,所以可以通过循环发消息的方法来更新系统时间。相关代码如下:

UPDATE_SYSTEM_TIME = (msg.what) {case UPDATE_SYSTEM_TIME:updateSystemTime();break;}/*** 更新系统的时间*/() {LogUtils.i(“updateSystemTime”);tvSystemTime.setText(StringUtil.formatSystemTime());handler.sendEmptyMessageDelayed(UPDATE_SYSTEM_TIME, 1000);}

updateSystemTime();方法先在initData的时候调用一次。

显示电池电量,这里准备了7张图,用来表示手机电池电量的显示。在initData时,注册一个电池电量的广播接受者,当电量改变时,更新一下显示电量的图片。代码如下:

/*** 注册电量变化的广播接受者*/() {IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);batteryChangeReceiver = new BatteryChangeReceiver();registerReceiver(batteryChangeReceiver, filter);} {(Context context, Intent intent) {//level:表示系统电量等级,0-100int level = intent.getIntExtra(“level”, 0);updateBatteryBg(level);}}/** * 根据系统电量等级去设置对应的图片 * * @param level 电量等级 */(int level) {if (level <= 0) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_0);} else if (level > 0 && level <= 10) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_10);} else if (level > 10 && level <= 20) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_20);} else if (level > 20 && level <= 40) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_40);} else if (level > 40 && level <= 60) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_60);} else if (level > 60 && level <= 80) {ivBattery.setBackgroundResource(R.mipmap.ic_battery_80);} else {ivBattery.setBackgroundResource(R.mipmap.ic_battery_100);}}

附一张图片,看前面的电量小图标,studio这一点很好

另外,提前说下,当退出该activity的时候,记得把所有的消息或者广播给移除掉。(养成良好的编程习惯。)

() {super.onDestroy();handler.removeCallbacksAndMessages(null);//清除所有的回调和消息unregisterReceiver(batteryChangeReceiver);}

初始化音量,这里要将SeeKBar的长度设置成音量的长度,并将进度设置成当前的音量。

/** * 初始化SeekBar的音量 */() {audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);LogUtils.i(“maxVolume = ” + maxVolume + ” currentVolume = ” + currentVolume);sbVolume.setMax(maxVolume);sbVolume.setProgress(currentVolume);}

initVolume();方法先在initData的时候调用一次

滑动SeekBar改变音量(注意:后面由于有这样一个功能:手指触摸屏幕显示上下控制面板,离开5秒后发一个广播隐藏控制面板,但如果手指已经在控制上下面板的话,需要将该广播取消,直到离开时,在重发广播。)

sbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {(SeekBar seekBar, int progress, boolean fromUser) {if (fromUser) {isMute = false;currentVolume = progress;updateVolume();}}(SeekBar seekBar) {handler.removeMessages(HIDE_CONTROL_LAYOUT);}(SeekBar seekBar) {handler.sendEmptyMessageDelayed(HIDE_CONTROL_LAYOUT, 5000);}});/** * 更新音量 */() {if (isMute) {//静音audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);sbVolume.setProgress(0);} else {//第三个参数 flags 0 -> 表示隐藏系统的音量的浮动面板 1 -> 表示显示系统的音量的浮动面板audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);sbVolume.setProgress(currentVolume);}}

通过手指的上下滑动更新系统音量,该项目需要这样的功能。这里是重写了onTouchEvent方法,代码注释写得比较详细了。主要有这么一些处理:忽略用户的误滑,不断判断是上滑还是下滑,使音量改变明显。

@Overridepublic boolean onTouchEvent(MotionEvent event) {gestureDetector.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downY = event.getY();break;case MotionEvent.ACTION_MOVE://1.计算出手指滑动的距离float deltaY = event.getY() – downY;//mTouchSlop 滑动的界限值 –> 避免 用户误滑 造成音量改变if (Math.abs(deltaY) < mTouchSlop) {break;}isMute = false;(deltaY > 0) { //下滑currentVolume–;} else if (deltaY < 0) {currentVolume++;}updateVolume();downY = event.getY();break;case MotionEvent.ACTION_UP:downY = 0;break;}return super.onTouchEvent(event);}显示/隐藏上下控制面板看着书里九万五千公里的绚丽。又或是和我一样,

Android 手机影音 学习过程记录(四)

相关文章:

你感兴趣的文章:

标签云: