您的位置:首页 > 其它

Symbian S60 5th 实现拖拽效果

2010-01-29 11:00 288 查看
Symbian S60从第五版开始支持触摸屏。从SDK中可知,触摸事件是由控件接受处理,开发者需要继承
CCoeControl:HandlePointerEventL()来处理触摸事件。一个简单使用此函数的例子如下(注意在MMP文件中需加入"LIBRARY cone.lib"):


 

void CSampleContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
{
switch (aPointerEvent.iType)
{
case TPointerEvent::EButton1Down:
{
// Button 1 down
// Get pointer position
TPoint positionX = aPointerEvent.iPosition.iX;
TPoint positionY = aPointerEvent.iPosition.iY;
break;
}
case TPointerEvent::EButton1Up:
{
// button 1 up
break;
}
case TPointerEvent::EDrag:
{
// drag event
break;
}
case TPointerEvent::EMove:
{
// move event
break;
}
default:
{
// do something
break;
}
}
}
 

有了这个函数,我们按照自己的想法来设计很多事件,比如触摸动作(触摸手势),关于这个的详细讨论可以看Nokia Wiki

 

下面介绍一个基于这个函数实现的拖拽效果。

 

首先,要使得程序能够接收到EDrag事件,需要在CSampleContainer(继承自CCoeControl)的构造函数中调用EnableDragEvents()。

 

其次,弄清楚S60 5th对EButton1Down, EButton1Up, EDrag 的响应方式。当我们在手机屏幕上拖拽时,首先,当触摸笔或手指按到屏幕上,EButton1Down事件会被响应,然后在拖拽过程中会周期性的响应EDrag事件,这个周期可以不用考虑(需要详细了解的可以查看SDK中SetMinInterDragInterval() 函数)。在离开屏幕时又会相应EButton1Up事件。据此响应事件,可以实现拖拽的效果。

 

下面是一个对超过屏幕显示高度的长文本显示实现上下拖拽的简单示例:

void CSampleContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
{
switch (aPointerEvent.iType)
{
case TPointerEvent::EButton1Down:
{
// Button 1 down
//iDeltaY和iPositionY是成员变量
iDeltaY=0;
iPositionY = aPointerEvent.iPosition.iY;
break;
}
case TPointerEvent::EButton1Up:
{
// button 1 up
break;
}
case TPointerEvent::EDrag:
{
int y = aPointerEvent.iPosition.iY-iDragPoint.iY;
iYbase = iYbase - iDeltaY + y;
iDeltaY = y;
if(iYbase>0)
iYbase=0;
if (iYbase<-iTotalHeight+iScreenHeight)
iYbase=-iTotalHeight+iScreenHeight;
break;
}
case TPointerEvent::EMove:
{
// move event
break;
}
default:
{
// do something
break;
}
}
}


iYbase是偏移量,也就是首行文字的纵坐标。Draw()函数根据这个坐标在屏幕上绘制文本。iDeltaY记录上一次EDrag响应时触摸笔坐标与初始触摸笔坐标的纵向差,以此计算新的iYbase。

 

现在,屏幕上的文字就随着你的手指上下移动了。当然稍加修改即可实现任意方向的拖拽。

 

 这篇文章写的比较简单,修改后的文章在这里,应该比较详细了,并且加上了一个示例。示例代码下载地址:http://yctx.me/file/DragExample.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息