×
Namespaces

Variants
Actions

Symbian^3 多点触摸

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
文章
shenjianguo 在 07 May 2010 创建
最后由 hamishwillee 在 15 Dec 2011 编辑

本例利用Symbian^3支持多点触摸功能,实现图片的拖拽,缩放,旋转 (本例利用了nokia forum 上图片处理的例子)

创建工程TouchDemo

1. 为支持多点触摸,symbian^3 的Rwindow 类增加了API: EnableAdvancedPointers,在构造函数ConstructL中,在 CreateWindowL后面,加上:

Rwindow& window = Window();  获得当前窗口 window.EnableAdvancedPointers();

在在HandlePointerEventL函数中 const TAdvancedPointerEvent* event = aPointerEvent.AdvancedPointerEvent(); if(!event) { // The TPointerEvent isn't an instance of TAdvancedPointerEvent User::Leave(KErrArgument); }

   检查是否为多点事件

2. 缩放 Symbian^3 关于多点的处理不同于iphone,iphone是把全部事件放在数组中一次处理,symbian^3的处理要复杂一点,每次只处理一点的事件,通过TAdvancedPointerEvent::PointerNumber(),可以得到当前事件的ID,序号从0开始,如果有两个点(两个手指),那就是0和1,缩放需要两点事件。 多点事件与单点事件的类型是以样的,都有: enum TType { EButton1Down,  button1, pen, finger, down EButton1Up,  button1, pen, finger, up

EButton2Down, EButton2Up, EButton3Down, EButton3Up,

EDrag,

EMove, EButtonRepeat, ESwitchOn, EOutOfRange, EEnterCloseProximity, EExitCloseProximity, EEnterHighPressure, EExitHighPressure, ENullType = -1 }; 我们要涉及到的事件类型有 EButton1Down,Edrag

在EButton1Down,两手指落下时记录下两点的位置,保存为iLastPoint1,iLastPoint2 在 Edrag,手指拖动时,也得到两点的位置,这时计算前后两次事件中两点的距离,EButton1Down为距离1,Edrag为距离2。当距离1大于距离2,并超过一个数值,我们称为threshold,则认为是放大; 当距离1小于距离2,并超过一个数值,则认为是缩小。我们用CalculateDistance函数计算两点距离。


3. 拖拽 单点事件,手指向左滑动,切换到下一副图片,手指向右滑动,切换到上一副图片。 这里需要检查是单点事件还是多点事件,引入新的变量 iIsAdvanced 标记是否多点事件, EButton1Down,TAdvancedPointerEvent::PointerNumber() 为0时,iIsAdvanced = Efalse, 先假定是单点事件,若EButton1Down,TAdvancedPointerEvent::PointerNumber() 得到1,说明有两点,则一定是多点事件了。若在Edrag 事件之前未获得ID为1的事件,我们就认为这是单点事件了。 剩下的事情比较简单,比较一下前后两点的位置,我们在Y方向限制一个范围,超出范围就认为不是滑动。若X2 <X1,并超过threshold,左滑;若X2>X1,并超过threshold,右滑。


4. 旋转 还是处理两点事件,EButton1Down,通过两点位置,计算得到相对水平方向的角度:iAngle,Edrag事件我们又可以得到一个角度angle。两个角度比较,angle > iAngle,并超过一个值,则认为是逆时针旋转; angle < iAngle,并超过一个值,则认为是顺时针旋转。

代码File:TouchDemo.zip

This page was last modified on 15 December 2011, at 09:16.
169 page views in the last 30 days.