Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Пример работы с LongTapDetector API - S60 Touch UI

From Wiki
Jump to: navigation, search
Article Metadata

Пример кода
Исходный файл: Media:LongTapDetector.zip

Совместимость
Платформа(ы):
S60 5th Edition

Статья
Автор: A.A.M. (28 Jan 2009)
Последнее редактирование: hamishwillee (23 Nov 2011)


Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.

Contents

Обзор

S60 5-го издания имеет интегрированный API, позволяющий обрабатывать определенной продолжительности нажатия указателя (например, стилуса) на сенсорный экран. В данной статье мы рассмотрим пример работы с этим API.

Long Tap Detector API

Чтобы получать события о продолжительных нажатиях указателя на экран следует использовать функциональность класса CAknLongTapDetector. Когда стилус на некоторое время задерживается в одной точке (по-умолчанию это 0.15 сек.), срабатывает показ анимированного оповещения, сигнализующего о том, что получено событие о продолжительном нажатии. Анимационное оповещение реализовано на уровне системного фреймворка (AVKON) и не может быть изменено. Тем не менее, это анимационное оповещение можно включать/выключать благодаря функции EnableLongTapAnimation класса CAknLongTapDetector.

LongTapDetector.png

Реализация функциональности Long Tap Detector

LongTapDetectorAppView.h

  • Для получения событий о продолжительных нажатиях указателя необходимо унаследовать класс от MAknLongTapDetectorCallBack и реализовать его виртуальную функцию HandleLongTapEventL().
  • Объявляем объект CAknLongTapDetector членом класса и используем его в качестве получателя событий о продолжительных нажатиях
....
#include <aknlongtapdetector.h>
....
// CLASS DECLARATION
class CLongTapDetectorAppView : public CCoeControl, MAknLongTapDetectorCallBack
{
.....
// From MAknLongTapDetectorCallBack
virtual void HandleLongTapEventL(const TPoint& aPenEventLocation, const TPoint& aPenEventScreenLocation);
.....
private:
CAknLongTapDetector* iLongTapDetector;
......
};

LongTapDetectorAppView.cpp

// -----------------------------------------------------------------------------
// CLongTapDetectorAppView::ConstructL()
// -----------------------------------------------------------------------------
//
void CLongTapDetectorAppView::ConstructL(const TRect& aRect)
{
// Создаем окно
CreateWindowL();
......
......
iLongTapDetector = CAknLongTapDetector::NewL(this);
.....
}
  • Мы можем указать желаемое время задержки до срабатывания события о продолжительном нажатии указателя. По-умолчанию время задержки равно 0.8 сек.
void CLongTapDetectorAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();
......
......
iLongTapDetector = CAknLongTapDetector::NewL(this);
iLongTapDetector->SetLongTapDelay(5000000); // Устанавливаем время задержки равным 5 сек.
.....
}
  • Мы можем указать желаемое время задержки до начала показа системного анимированного оповещения о продолжительном нажатии указателя. По-умолчанию время задержки равно 0.15 сек.
void CLongTapDetectorAppView::ConstructL(const TRect& aRect)
{
// Создаем окно
CreateWindowL();
......
......
iLongTapDetector = CAknLongTapDetector::NewL(this);
iLongTapDetector->SetTimeDelayBeforeAnimation(2000000); // Устанавливаем время задержки равным 2 сек.
.....
}
  • Пример обработки событий в HandlePointerEventL:
// -----------------------------------------------------------------------------
// CLongTapDetectorAppView::HandlePointerEventL()
// Вызывается фреймворком при получении событий от указателя (стилуса)
// -----------------------------------------------------------------------------
//
void CLongTapDetectorAppView::HandlePointerEventL(
const TPointerEvent& aPointerEvent)
{
// Передаем событие от указателя в обработчик объекта iLongTapDetector
iLongTapDetector->PointerEventL(aPointerEvent);
 
// Передаем событие базовому классу
CCoeControl::HandlePointerEventL(aPointerEvent);
}
  • События о продолжительном нажатии могут быть обработаны в реализации функции HandleLongTapEventL()
  • Оба аргумента функции HandleLongTapEventL несут информацию о координатах следующих двух точек:
    • aPenEventLocation координаты точки нажатия относительно родительского объекта.
    • aPenEventScreenLocation координаты точки нажатия относительно экрана.
void CLongTapDetectorAppView::HandleLongTapEventL(const TPoint& aPenEventLocation,
const TPoint& aPenEventScreenLocation)
{
// В данном примере просто показывается информационное сообщение
CAknInformationNote* info = new (ELeave) CAknInformationNote;
info->ExecuteLD(_L("Really Long one"));
}
  • Не забудьте удалить объект iLongTapDetector в деструкторе класса.
// -----------------------------------------------------------------------------
// CLongTapDetectorAppView::~CLongTapDetectorAppView()
// Destructor.
// -----------------------------------------------------------------------------
//
CLongTapDetectorAppView::~CLongTapDetectorAppView()
{
.....
.....
if(iLongTapDetector)
{
delete iLongTapDetector;
iLongTapDetector = NULL;
}
.....
}

Полезные функции

CAknLongTapDetector

  • PointerEventL()
  • EnableLongTapAnimation()
  • SetLongTapDelay()
  • SetTimeDelayBeforeAnimation()

MAknLongTapDetectorCallBack

  • HandleLongTapEventL()

Ключевые моменты

Заголовочные файлы

  • #include <aknlongtapdetector.h>

Классы

  • CAknLongTapDetector
  • MAknLongTapDetectorCallBack

Библиотеки

  • avkon.lib

Демонстрационное приложение

Связанные ссылки



При подготовке статьи использованы следующие материалы:

Источники дополнительной информации

This page was last modified on 23 November 2011, at 04:23.
257 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×