随笔 - 32  文章 - 94  trackbacks - 0
<2015年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(8)

随笔分类

随笔档案

好友连接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

又好久没有更新blog了,这段时间仍然是造那个车轮,是一个用opengl es1.0 + 一些平台相关的工具函数,实现的2d游戏gui引擎,还造得破破烂烂不堪入目的那种。结果却拿去做移植一个以gui表现为主的游戏。。。。。一开始还好,只是各种消息焦点、对象Capture引发的问题,直到后来的多点触摸。。。。。




刚开始虽然没有多点触摸的需求,但也是留有一个多点触摸的接口的,就是各种TouchDown、TouchMove、TouchUp里面都有传递一个TouchID,后来确定了使用多点触摸,于是原来的地方就出现了问题:

1、第一个手指点下某个对象A(比如按钮),这时A就记住了被某个TouchID点下的状态,保持点下状态,同时另外一个手指点击另一个对象B按钮,B按钮响应点击弹出一个界面,这个界面就把A挡在后面了,这时第一个手指才弹起来,这时的UI控件树第一个遍历到的是上面那个界面,于是A响应不到弹起的事件了。。。。

2、正常的UI消息传递都是父对象先把touch消息传给各个子对象,发现没有子对象响应时,才考虑父对象自己的响应。但如今要模仿iphone的那个滚动列表,滚动列表容器里面放了很多子对象,一开始,滚动容器处于静止状态,按下和弹起时,确实子对象先响应,但按下并移动到一个阈值,滚动容器进入滚动状态,于是让子对象响应失去消息,后面的移动就都是响应滚动了,直到弹起并再次点击,才响应停止滚动,进入正常状态。这样就有一个问题:无法嵌套多个滚动对象?,另外,也出现了各种响应不正常的bug

3、这个问题从上面扩展开来。一个项目做了一半,又要加入多点触摸进行放大缩小的功能,再加上上面的滚动列表功能,为了保持原来的功能不变,滚动列表的代码不改,于是设计了一个多点触摸对象作为父对象,初始化时确定最大支持的触控数量值,响应触摸时,响应回调函数来处理各种功能,另外回调函数还可以决定是否把触摸消息传给子对象。这样假设初始化一个2点触摸对象,回调函数判断只有一个触摸时,传递给滚动列表子对象,有两个触摸时,让滚动列表子对象失去消息,并再不传递给它,照理来说应该不会有什么隐患,不过测试多次,也是会出现响应不正常的bug。

解决方案:UI控件对象保存自己被哪个Touch对象响应到 是有缺陷的,应该是实现一系列Touch对象,让Touch对象保存响应的UI对象。这样貌似整个框架要重构?
posted on 2010-12-17 23:26 陈昱(CY) 阅读(3146) 评论(10)  编辑 收藏 引用 所属分类: C++游戏编程

FeedBack:
# re: 多点触摸的GUI? 2010-12-17 23:58 陈梓瀚(vczh)
你觉悟了,很好  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-18 13:17 陈昱(CY)
@陈梓瀚(vczh)
生米煮成熟饭了。。。。  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-22 20:07 magicRoy
>>正常的UI消息传递都是父对象先把touch消息传给各个子对象

楼主的这个理解有问题吧,应该是ui消息从子对象向父对象传递。如果这个ui的坐标系是你自己管理的,应该可以准确定位到任意一个对象。消息应该是先传到子对象,子对象不处理,父对象再处理。
我曾经也做了一个类似的系统,后来发现消息的传导应该是从小到打。虽然从大到小逻辑上容易理解,但是实际上从小到大更加灵活和有效率。  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-23 02:04 
话说,最近看WPF对消息的处理很有感悟啊,UI这个东西还有多点触摸,的确得有一个很灵活的架构才能好做。
给楼主一点个人建议:每个UI控件对某一个输入设备的消息都有一对响应,譬如鼠标左键按下要调用两个函数:preMouseLDown和onMouseLDown,前者是从父控件穿来的,后者是从子控件传来的,楼上说的从子控件往父控件传是必须的,但是不能舍弃从父控件往子控件传消息的这一流程。判断输入点的过程是从父到子的,每级递归判断找到响应控件是最有效率的,顺带就调用一下每个控件的preMouseLDown()函数,这样的消息流通机制是自顶向下,又回溯向上到顶的一个过程。
如此设计的话,应该改动不大,但收效会很明显,多点触摸和滚动的实现会变得很容易。  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-23 17:07 陈梓瀚(vczh)
@magicRoy
我读书的时候做的系统是,先从大到小,再从小到大……后来一看,TM那个WPF也是这么干的  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-23 17:07 陈梓瀚(vczh)
@酿
嗯  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-23 18:03 magicRoy
@陈梓瀚(vczh)
什么意思?先从大到小,再从小到大?

简单的说,你认为是应该子对象先收到鼠标事件,还是父对象先收到?  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-25 11:55 Jedi-CY
我在从小到大的回馈流程只有一个简单的『是否捕获』标识  回复  更多评论
  
# re: 多点触摸的GUI? 2010-12-25 13:19 陈昱(CY)
回馈流程一个bool标识在鼠标上是没有问题的,但不能简单搬到多点触摸上。消息响应有问题的原因是 对象要记住的TouchID已经不存在了。鼠标位置是一直存在的,但是一个touch是有生命的。  回复  更多评论
  
# re: 多点触摸的GUI? 2011-01-04 00:14 yrj
为什么要 TouchDown 的时候 B 按钮响应点击弹出一个界面?要识别 TouchDown、TouchMove、TouchUp 整个过程的轨迹后,UI 对象才能执行相应的动作。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理