qt android 手势,实现Qt程序的滑动手势

// customGesture.cpp#include

#include

#include

#include "customgesture.h"

SwipeGestureRecognizer::SwipeGestureRecognizer()

{

}

bool

SwipeGestureRecognizer::IsValidMove(int dx, int dy)

{

// The moved distance is to small to count as not just a glitch.

if ((qAbs(dx) < MINIMUM_DISTANCE) && (qAbs(dy) < MINIMUM_DISTANCE)) {

return false;

}

return true;

}

// virtual

QGesture*

SwipeGestureRecognizer::create(QObject* pTarget)

{

//qDebug("SwipeGestureRecognizer::create() called");

QGesture *pGesture = new QSwipeGesture(pTarget);

return pGesture;

}

// virtual

QGestureRecognizer::Result

SwipeGestureRecognizer::recognize(QGesture* pGesture, QObject *pWatched, QEvent *pEvent)

{

QGestureRecognizer::Result result = QGestureRecognizer::Ignore;

QSwipeGesture *pSwipe = static_cast(pGesture);

switch(pEvent->type()) {

case QEvent::MouseButtonPress: {

QMouseEvent* pMouseEvent = static_cast(pEvent);

#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)

pSwipe->setProperty("startPoint", pMouseEvent->posF());

#else

pSwipe->setProperty("startPoint", pMouseEvent->localPos());

#endif

result = QGestureRecognizer::MayBeGesture;

//qDebug() << "Swipe gesture started (start point=" << pSwipe->property("startPoint").toPointF() << ")";

}

break;

case QEvent::MouseButtonRelease: {

QMouseEvent* pMouseEvent = static_cast(pEvent);

const QVariant& propValue = pSwipe->property("startPoint");

QPointF startPoint = propValue.toPointF();

#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)

QPointF endPoint = pMouseEvent->posF();

#else

QPointF endPoint = pMouseEvent->localPos();

#endif

// process distance and direction

int dx = endPoint.x() - startPoint.x();

int dy = endPoint.y() - startPoint.y();

//bugfix: startPoint.isNull because we sometimes get false events with startpoint 0 -> wrong swipe detected!

if ( (!IsValidMove(dx, dy)) || ( startPoint.isNull() ) ) {

// Just a click, so no gesture.

result = QGestureRecognizer::CancelGesture;

//qDebug("Swipe gesture canceled");

} else {

// Compute the angle.

//qDebug() << " startPoint= " << startPoint << " endPoint=" << endPoint << " dx=" << dx << " dy=" << dy;

qreal angle = ComputeAngle(dx, dy);

pSwipe->setSwipeAngle(angle);

result = QGestureRecognizer::FinishGesture;

//qDebug("Swipe gesture finished");

}

}

break;

default:

break;

}

return result;

}

void

SwipeGestureRecognizer::reset(QGesture *pGesture)

{

pGesture->setProperty("startPoint", QVariant(QVariant::Invalid));

parent::reset(pGesture);

}

qreal

SwipeGestureRecognizer::ComputeAngle(int dx, int dy)

{

double PI = 3.14159265;

// Need to convert from screen coordinates direction

// into classical coordinates direction.

dy = -dy;

double result = atan2((double)dy, (double)dx) ;

result = (result * 180) / PI;

// Always return positive angle.

if (result < 0) {

result += 360;

}

return result;

}

/*

==========================================================================

*/

QSwipeGesture::SwipeDirection

SwipeGestureUtil::GetHorizontalDirection(QSwipeGesture *pSwipeGesture)

{

qreal angle = pSwipeGesture->swipeAngle();

if (0 <= angle && angle <= 45) {

return QSwipeGesture::Right;

}

if (135 <= angle && angle <= 225) {

return QSwipeGesture::Left;

}

if (315 <= angle && angle <= 360) {

return QSwipeGesture::Right;

}

return QSwipeGesture::NoDirection;

}

QSwipeGesture::SwipeDirection

SwipeGestureUtil::GetVerticalDirection(QSwipeGesture *pSwipeGesture)

{

qreal angle = pSwipeGesture->swipeAngle();

if (45 < angle && angle < 135) {

return QSwipeGesture::Up;

}

if (225 < angle && angle < 315) {

return QSwipeGesture::Down;

}

return QSwipeGesture::NoDirection;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值