Пример работы с LongTapDetector API - S60 Touch UI
Метаданные
Пример кода
Статья
Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.
Contents |
Обзор
S60 5-го издания имеет интегрированный API, позволяющий обрабатывать определенной продолжительности нажатия указателя (например, стилуса) на сенсорный экран. В данной статье мы рассмотрим пример работы с этим API.
Long Tap Detector API
Чтобы получать события о продолжительных нажатиях указателя на экран следует использовать функциональность класса CAknLongTapDetector. Когда стилус на некоторое время задерживается в одной точке (по-умолчанию это 0.15 сек.), срабатывает показ анимированного оповещения, сигнализующего о том, что получено событие о продолжительном нажатии. Анимационное оповещение реализовано на уровне системного фреймворка (AVKON) и не может быть изменено. Тем не менее, это анимационное оповещение можно включать/выключать благодаря функции EnableLongTapAnimation класса CAknLongTapDetector.
Реализация функциональности 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
Демонстрационное приложение
Связанные ссылки
- Примеры работы с S60 Touch UI
- Пример работы с Toolbar API - S60 Touch UI
- Пример работы с Stylus Pop-up Menu API - S60 Touch UI
- Пример работы с Tactile Feedback Client API - S60 Touch UI
- Пример работы с Adaptive Search - S60 Touch UI
- Пример работы с ChoiceList API - S60 Touch UI
- Пример работы с Generic Button API - S60 Touch UI
- Пример работы с Hierarchical Lists API (SingleStyleTreeList) - S60 Touch UI
- Пример работы с Hierarchical Lists API (SingleColumnStyleTreeList) - S60 Touch UI
При подготовке статьи использованы следующие материалы:
Источники дополнительной информации
- S60 5th edition SDK help
- S60 5th Edition C++ Developer's Library v1.0



(no comments yet)