Статья базируется на материалах англоязычной части Wiki, все они перечислены в разделе ссылки.
Contents |
TactileFeedback API - это нововведение S60 5-го издания, позволяющее ощутить "отдачу" устройства в ответ на прикосновения к сенсорнорному экрану. Отдача может быть в форме либо звукового сигнала, либо вибрации, либо одновременно и звукового сигнала и вибрации. В данной статье мы рассмотрим пример работы с этим API.
Тактильная отдача может срабатывать ответ на при прикосновении к сенсорнорному экрану в целом или к конкретному элементу пользовательского интерфейса. Большинство компонентов пользовательского интерфейса S60 5-го издания имеют встроенную возможность, обеспечивающую поддержку тактильной обратной связи (отдачи). Следует внимательно относиться к реализации функциональности обратной связи в своих приложениях, так как излишне частое использование отдачи может вызывать у пользователя некоторый дискомфорт.
Реализуем отправку устройством отдачи в ответ на прикосновение пользователя к текстовой метке.
...
...
#include <touchfeedback.h>
#include <eiklabel.h> // для текстовой метки
// CLASS DECLARATION
class CTactileFeedbackAppView : public CCoeControl, MCoeControlHitTest
{
....
....
//For label control
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
//From MCoeControlHitTest
TBool HitRegionContains( const TPoint& aPoint, const CCoeControl& /*aControl*/ ) const;
private:
....
....
MTouchFeedback* iTouchFeedback; // для тактильной отдачи
CEikLabel* iLabel; // для текстовой метки
};
// -----------------------------------------------------------------------------
// CTactileFeedbackAppView::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CTactileFeedbackAppView::ConstructL(const TRect& aRect)
{
// Создаем окно
CreateWindowL();
_LIT(KTextHelloWorld, "hello world");
iLabel = new (ELeave) CEikLabel;
iLabel->SetContainerWindowL( *this );
iLabel->SetTextL(KTextHelloWorld);
iLabel->SetHitTest(this);
// Устанавливаем размеры окна
SetRect(aRect);
iTouchFeedback = MTouchFeedback::Instance();
}
// ---------------------------------------------------------------------------
// From class MCoeControlHitTest.
// Определяем, входит ли точка соприкосновения стилуса с экраном в область, занимаемую текстовой меткой.
// ---------------------------------------------------------------------------
//
TBool CTactileFeedbackAppView::HitRegionContains( const TPoint& aPoint,
const CCoeControl& /*aControl*/ ) const
{
return (iLabel->Rect().Contains( aPoint ) );
}
// -----------------------------------------------------------------------------
// CTactileFeedbackAppView::HandlePointerEventL()
// Вызывается фреймворком при получении событий от указателя (стилуса)
// -----------------------------------------------------------------------------
//
void CTactileFeedbackAppView::HandlePointerEventL(
const TPointerEvent& aPointerEvent)
{
TPoint point = aPointerEvent.iPosition;
if(aPointerEvent.iType == TPointerEvent::EButton1Down)
{
if ( HitRegionContains( point, *iLabel ))
iTactileFeedback->InstantFeedback(ETouchFeedbackBasic);
}
// Передаем событие базовому классу
CCoeControl::HandlePointerEventL(aPointerEvent);
}
// -----------------------------------------------------------------------------
// CTactileFeedbackAppView::SizeChanged()
// Вызывается системой в случаем изменения размеров отображения.
// -----------------------------------------------------------------------------
//
void CTactileFeedbackAppView::SizeChanged()
{
iLabel->SetExtent( TPoint(0,0), iLabel->MinimumSize());
}
TInt CTactileFeedbackAppView::CountComponentControls() const
{
return 1; // возвращаем число компонентов в контейнере
}
CCoeControl* CTactileFeedbackAppView::ComponentControl(TInt aIndex) const
{
switch ( aIndex )
{
case 0:
return iLabel;
default:
return NULL;
}
}
// -----------------------------------------------------------------------------
// CTactileFeedbackAppView::~CTactileFeedbackAppView()
// Деструктор.
// -----------------------------------------------------------------------------
//
CTactileFeedbackAppView::~CTactileFeedbackAppView()
{
if(iLabel)
{
delete iLabel;
iLabel = NULL;
}
}
При подготовке статьи использованы следующие материалы:
No related wiki articles found