2021/03/26:
参考如下:有惯性,有回顶效果;使用手势
QT使用之 :手指滑动后物理惯性滑动-动画的实现,根据不同速度有不同的效果
一、 前言
首先,因为是使用手指滑动,所以控件要求能够支持 touch事件
添加touch事件的思路可以参考之前的文章:
QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理
二、思路
1、思路其实很简单,就是 touch 事件结束之后,让滚动条自己再继续滚动一会就可以了;
2、对于惯性减速的实现,在touch事件开始以及结束的时候,可以获取touch的方向以及速度;
3、动画的实现,使用QTimer间隔一定的时间后,对于当前滑动实现减速 + 滑动的效果
三、实现代码
主要就是定时器的使用~
代码中的startPoint 和 endPoint 依旧是使用QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理中的逻辑,所以得看一下
bool WidgetTouch::touchEndEventProcess(QEvent *event)
{
QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
int touchDistance = qAbs (startPoint.x() - endPoint.x());
touchEnd_time =QTime::currentTime();
elapsed = touchBegin_time.msecsTo(touchEnd_time);
speed = touchDistance * 1000 / elapsed; // 计算当前滑动的速度 单位 s
m_rollTime = 20;
m_rollTimer->setInterval(m_rollTime);
// 增加阈值
if (touchDistance >= 10 && elapsed >200)
{
startRoll();
}
touchEvent->accept();
return true;
}
// 物理惯性动画效果
void WidgetTouch::startRoll()
{
m_rollTimer->start();
}
void WidgetTouch::onTimeout()
{
everyDistance = speed * m_rollTime / 1000;
// 此处的 bar 就是自己定义的 需要滚动的 QScrollBar
bar->setValue(bar->value() + everyDistance);
if (speed >= 40) {
// 每一次 40 px
speed -= 40;
} else {
m_rollTimer->stop();
}
update();
}