Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

实现播放条按住不动时更精确地定位;拖动时显示拖动目标时间 #16

Merged
merged 1 commit into from
Apr 29, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 27 additions & 26 deletions BottomWidgets/BottomWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,25 +273,19 @@ void BottomWidget::durationChanged(qint64 duration)
//void MainWidget::musicPositionChanged(int pos) invoked
void BottomWidget::positionChanged(int position)
{
qDebug()<<"void BottomWidget::positionChanged(int position="<<position<<") sliderSong->value()="<<sliderSong->value();

if(!AdjustingPos)
{
audioOriginalPos = position; //持续更新 audioOriginalPos,这样在拖动时则会保留拖动时刻的位置
qDebug()<<"BottomWidget::positionChanged => audioOriginalPos="<<audioOriginalPos<<" sliderSong->value()="<<sliderSong->value();

int pecentOfThousand = musicPlayer->duration() == 0? 0: int(1.0 * position / musicPlayer->duration() * 1000);
sliderSong->setValue(pecentOfThousand);
}

int ms = position % 1000;
position = position/1000;
int s = position % 60;
int m = position/60;

QString timeLabel;
timeLabel.sprintf("%.2d:%.2d.%.3d",m, s, ms);
showPosition(position);
}
}

labelTimeCurrent->setText(timeLabel);

}

void BottomWidget::setCurrentPlayMode(int mode)
{
Expand All @@ -314,42 +308,36 @@ void BottomWidget::onSliderSongMoved(int position)

if(AdjustingPos){
posAdjust = musicPlayer->duration() * position / 1000;
// 如果不需要拖动sliderSong时CurrentTimeLabel也改变,可以把posAdjust的计算放到onSliderSongReleased()中,position改为sliderSong->value()

// positionChanged(posAdjust);
// 想要拖动sliderSong时CurrentTimeLabel也改变
// 暂时没有实现
showPosition(posAdjust);
}
else{
sliderSong->setValue(sliderSongOriginalPos);//sliderSong回到原来的位置
// 制作时,按住或拖动sliderSong会使其不移动,这需要改
//制作歌词时,AdjustingPos始终为 false, positionChanged 会一直更新进度条,
//此时,用户按下拖动,也无需处理了
}
}

void BottomWidget::onSliderSongPressed()
{
qDebug()<<"void BottomWidget::onSliderSongPressed() sliderSong->value()="<<sliderSong->value()<<" musicPlayer->state()="<<musicPlayer->state();

sliderSongOriginalPos = sliderSong->value();//记录当前值,准备与最终值比较

if(bInMakingMode || musicPlayer->state() == MusicPlayer::StoppedState){
return ; //制作模式或停止状态时不允许sliderSong被成功拖动,但并没有阻止信号被接收
}

AdjustingPos = true;
posAdjust = -1; // -1 标记表示还没有任何拖动
}

void BottomWidget::onSliderSongReleased()
{
qDebug()<<"void BottomWidget::onSliderSongReleased() sliderSong->value()="<<sliderSong->value()<<" posAdjust="<<posAdjust;

if(AdjustingPos){
if(sliderSong->value() != sliderSongOriginalPos){
//sliderSong.value精度不够,让一段时间均落在同一个value值中。
//低精度并不影响定位,但如果最终并没有改变位置,那就可能由于onSliderSongMoved()计算的posAdjust精度不够而发生偏移;

if(posAdjust == -1)
musicPlayer->seek(audioOriginalPos);
else
musicPlayer->seek(posAdjust);
}

AdjustingPos = false;
}
}
Expand Down Expand Up @@ -446,4 +434,17 @@ void BottomWidget::onAudioPause()
setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_play.png\");}");
}

void BottomWidget::showPosition(int position)
{
int ms = position % 1000;
position = position/1000;
int s = position % 60;
int m = position/60;

QString timeLabel;
timeLabel.sprintf("%.2d:%.2d.%.3d",m, s, ms);

labelTimeCurrent->setText(timeLabel);
}


5 changes: 4 additions & 1 deletion BottomWidgets/BottomWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ private slots:
void onAudioPlay();
void onAudioPause();

private:
void showPosition(int position); //预览位置,在调整拖动时使用

private:
bool bInMakingMode; //标记是否在制作模式中

Expand Down Expand Up @@ -93,7 +96,7 @@ private slots:
bool AdjustingPos;
quint64 posAdjust;

int sliderSongOriginalPos; //sliderSong被按下时的位置
int audioOriginalPos; //音频被按下时的位置(为了记录下精确地时间,记录音频位置,之前记录slider位置精度不够会导致偏移)
};

#endif // BOTTOMWIDGET_H