QT使用之 手指滑动 | 物理惯性继续滑动动画的实现,根据不同速度实现不同动画效果

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();
}

猜你喜欢

转载自blog.csdn.net/qq_43473694/article/details/111038823