该fragment里面一共有4个manager:ServiceManger,MainBottomUIManager,SlidingDrawerManager,UIManager还有一个timer:MusicTimer
ServiceManager已经在上一篇中讲述过,下面先讲MainBottomUIManager,里面有一个handler,是public的,也就是说会被外界持有该handler的引用
MainBottomUIManager里面供外界调用的方法主要有2个refreshUI和showPlay,里面的控件除了AlwaysMarqueeTextView都是基本控件,AlwaysMarqueeTextView控件只是重写了isFocus()方法。
mhandler:
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
refreshSeekProgress(mServiceManager.position(),
mServiceManager.duration());
}
};
从这里可以看出msg并没有什么毛用,但每次都要refreshSeekProgress,参数是从mServiceManager的public方法中传过来的。
简单来讲就是更新音乐播放的进度条。音乐在播放的时候进度条是频繁更新的。
里面的position()和duration()的方法定义是在com.ldw.music.service.MediaService里面定义的(在上一篇MainFragment2里面解释过),以下是方法定义:
@Override
public int duration() throws RemoteException {
return mMc.duration();
}
@Override
public int position() throws RemoteException {
return mMc.position();
}
以下是seekprogress的布局文件定义,从里面可以知道max=“100”
<ProgressBar
android:id="@+id/playback_seekbar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/bottomLayout"
android:max="100"
android:maxHeight="2.0dip"
android:minHeight="2.0dip"
android:progressDrawable="@drawable/playback_seekbar2" />
从refreshSeekProgress()的工作方式可以知道它传入的参数是为了获取一个比例最后和100相乘获取progress的值,同时更新mPositionTv(音乐播放时间)。
refreshUI方法,更新所有的BottomUI,包括2个AlwaysMarqueeTextView,2个TextView,一个Imageview的headIcon
showPlay方法,控制是播放的button还是暂停的button,传入的boolean类型的值,设置gone还是visible
public void showPlay(boolean flag) {
if (flag) {
mPlayBtn.setVisibility(View.VISIBLE);
mPauseBtn.setVisibility(View.GONE);
} else {
mPlayBtn.setVisibility(View.GONE);
mPauseBtn.setVisibility(View.VISIBLE);
}
}
注意:play和pause在同一个位置,通过framelayout或者relativelayout(没有相对位置的时候就是一个摞着一个)都可以实现。
onClick方法里面设置4个监听事件,2个控制播放和暂停,1个控制下一首,都是通过serviceManger控制的,另一个控制显示slidingmenu。要调用主activity的成员变量mSlidingMenu的方法。