最近一直在弄移植,将3rd的程序移植到5th上,个人感觉,如果使用的都是系统控件的话,那么工程将要改动的地方很少。可能主要的工作就是添加上触摸事件。如果你的前任将接口或者代码写的比较好的话,那么恭喜你改起来会相当容易。
说一下我的心得吧,刚刚接触触摸事件,有点不大适应。会用的也就EButton1Down
,EButton1Up这两个事件,至于拖动EDrag和EMove直接不用也不明白,现在感到很欣慰的是EDrag搞明白了点,而EMove现在也不懂,希望高手留言指点下。
如果现在symbian实现拖动,相对来说还是比较容易的。举个例子来说,我想实现一个矩形在屏幕上的拖动。
首先,先定义个成员 TRect iRect;
然后在Draw函数中画整个矩形,在这里不累述了。
之后就是处理拖动事件。
当点击屏幕的时候会产生个
EButton1Down
事件,这里一般我们需要记录一下他的位置可以用事件的iPosition这个成员获取到你点击的位置,TPoint point1;
如果你一直在屏幕上,然后拖动,那么接下来系统会不停的回调HandlePointerEvent这个函数,然后事件类型iType是EDrag,这个时候我们只需要这样写,如下
if ( aPointerEvent.iType == TPointerEvent::EDrag )
{
TPoint point2 = aPointerEvent.iPosition - point1; //相对于第一个点移动的位置
iRect.Move(point2 ); //
point1 = aPointerEvent.iPosition //记录这次拖动的事件的位置
DrawNow();
}
这样就可以实现矩形的拖动了,当然触摸事件还没有结束,还会相应一个事件。
最后会相应
EButton1Down
这个事件。
如果当初的是点击下屏幕,那么就只会有
EButton1Down
和EButton1Down
两个事件。
所以最后是在处理时间的时候,写下判断条件,因为handlePointerEvent一般是会调用两边的。
加上相应的触摸后,基本3rd转5th的工作就OK了。
最后是打包了,如果当时是3rd生成的工程,当然打包后可以直接用,但是一般会在安装的时候提示软件可能不兼容等等提示信息。这个时候开个UID就好。将pkg中的0x101F7961改为0x1028315F。对于具体的UID的介绍可以看下一遍blog。
暂时先写这么多了,如果有说的不对和不足的地方,希望路过的大牛小牛,大神大婶们留个脚印。
注:要想使用EDrag,别忘了在container的ConstructL中加一句EnableDragEvents();
这几天又发现些问题,可能是3rd的开发习惯了,也有可能是对于触摸事件处理没有经验的原因吧!出了些很理想化的问题。比如我一个简单的点击事件。我单纯的认为就会产生一个down和up事件,理论上是这样,但是现实总是残酷的。往往一些屏幕比较差的机器,在你想单纯的产生一个点击的事件(就是我们理想的down和up事件)的时候,往往都会产生一个EDrag(拖动)事件,所以大家在处理触摸事件的时候,最好是将拖动距离很短的事件也判断为一个简单的点击事件。