转自:http://www.cnblogs.com/NEOCSL/archive/2013/03/04/2942861.html

iterface ITouchable;

function OnPick(ETouchType type,float x,float y);
 

  1.定义一个接口。这个接口由MenuObject来实现,也就是所有的按钮Object。

class AntMenuObject extends MobileMenuObject implements(ITouchable);

function OnPick(ETouchType type,float x,float y)
{
if(bIsActive)
{
if(CheckBound(x,y))
{
bIsHightLighted=true;
bIsTouched=true;
}
else if(Type==Touch_Ended||Type==Touch_Cancelled)
{
bIsHightLighted=false;
bIsTouched=false;
} }
else
{
bIsHightLighted=true;
bIsTouched=true;
}
} function bool CheckBound(x,y)
{
if(x>=left&&x<=Left+width&&YTop&&Y>=Top&&Y<=Top+Height)
{
return true;
}
return false
}

  CheckSwipe是一个功能性非常强的函数,该函数可以检测屏幕是划过还是点击。只能在MenuScene中进行检查,因为只有整个屏幕才能检测是否划过。

function bool OnSceneTouch(ETouchType EventType, float TouchX, float TouchY,bool bInside)
{
if(EventType==Touch_Began)
{
bSwipe=false;
StartTouchLocation.x=TouchX;
StartTouchLocation.y=TouchY;
}
else if(EventType==Touch_Moved)
{
CurrentTouchLocation.x=TouchX;
CurrentTouchLocation.y=TouchY; CheckSwipe();
}
}

  检测Swipe就是检测两者之间的距离

function bool CheckSwipe()
{
return bSwipe=VSize(StartTouchLocation-CurrentTouchLocation)>SwipeTolerance;
}

  2.最重要的地方是List的列表处理,秉承着列表优先原则,但是如果处理不了列表就可以让实现接口的ITouchable,OnPick

if(List.bIsHidden||List==none)
{
foreach MenuObjects(Touchable)
{
if(ITouchable(Toucable)!=none)
{
ITouchable(Touchable).OnPick(EventType,TouchX,TouchY);
}
}
}

  否则就处理列表

if(!List.bIsHidden&&List!=none)
{
ITouchable(List).OnPick(EventType,TouchX,TouchY);
}

  我们先进入List看看他的OnPick函数是怎么针对Swipe和Touch做处理的。That's very important。

  OnPick处理滑动动作,并且感应器范围检测是否为bSwipe,如果是就滚动页面,不是就让foreach Items(Label)   {Label.OnPick(EventType,X,Y);}

  3.现在根据这个代理我们被引入到Button中,Lable是在List中对所有添加的AntMobileMenuButton的遍历引用按钮。

  AntMobileMenuButton中对OnPick做了代理

delegate OnClick(ETouchType EventType,float X,float Y);

function OnPick(ETouchType EventType,float x,float y)
{
//CheckBounds(x,y)Objects内定义的有没有在边界内
if(EventType==Touch_End&&CheckBounds(X,Y))
{
//在List的AddItem中可以看到,将NewItem.OnClick=OnSelect;了
//于是我们赶快进入OnSelect中一探究竟,这可是对按钮做对应动作处理的地方
//我很好奇点下按钮我到底在哪里添加功能
OnClick(self,x,y);
}
}

  注意OnClick的第一个参数接受的是自己,button类别,也就是Sender消息。

  4.我们进入List的OnSelect中分析

function OnSelect(AntMobileMenuObject sender,float x,float y)
{
local AntMobileMenuButton label;
local int i; //起先设置i为第一个,以后我需不需要这个还说不定
i=0; //若果有接收信号输出,我们就遍历看是哪个按钮接收的
if(AntMobileMenuButton(Sender)!=none)
{
foreach Items(label)
{
//匹配对应的按钮,然后执行动作
if(label==AntMobileMenuButton(Sender)
{
//在这里添加对应的执行内容,例如武器的引用
//最后用按钮来对应具体的动作,例如玩家的武器列表
//通知列表选择的哪个
SelectedIndex=i;
Sender.bIsHighLighted=true;
//同时我们发现了一个新代理
OnChange(i,Label.Caption,X,Y); //后边我们看看这个代理被分配到了哪里
break;
}
i++;
} }
ScrollAmount=0;
ScrollInertia=0;
}

  代理的声明,看看在ComboBox中哪里将会将List.OnChange=?

delegate OnChange(int Idx,string item,float x,float y);

  5.进入ComboBox

  在初始化的时候将List的OnChange分配给了OnSelect,然后执行选中的动作,也就是关闭List,但是问题来了,即使没有分配OnChange代理也能成功。

滑动swipe的妙用的更多相关文章

  1. 移动端tab滑动和上下拉刷新加载

    移动端tab滑动和上下拉刷新加载 查看demo(请在移动端模式下查看) 查看代码 开发该插件的初衷是,在做一个项目时发现现在实现移动端tab滑动的插件大多基于swiper,swiper的功能太强大而我 ...

  2. Python Appium 滑动、点击等操作

    Python Appium 滑动.点击等操作 1.手机滑动-swipe # FileName : Tmall_App.py # Author : Adil # DateTime : 2018/3/25 ...

  3. 『与善仁』Appium基础 — 23、操作滑动的方式

    目录 1.swipe滑动 2.scroll滑动 3.drag拖拽事件 4.滑动方法小结 5.拓展:多次滑动 6.综合练习 在Appium中提供了三种滑动的方式,swipe滑动.scroll滑动.dra ...

  4. 移动开发框架剖析(二) Hammer专业的手势控制

    浏览器底层并没有给元素提供类似,单击,双击,滑动,拖动这些直接可以用的控制接口,一切的手势动作都只能通过模拟出来.移动端浏览器唯一给我们提供的就只是mousedown -> mousemove ...

  5. Zepto.js touch模块深入分析

    目的:记录 Zepto.js touch模块 源码阅读 源码: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely ...

  6. Appium 客户端库 API

    ## Appium 客户端库 Appium 有对应以下语言的客户端库: 语言 | 代码 :--|--:[Ruby][rubygems] | [GitHub](https://github.com/ap ...

  7. 【IOS笔记】Gesture Recognizers

    Gesture Recognizers Gesture recognizers convert low-level event handling code into higher-level acti ...

  8. 手势识别(一)--手势基本概念和ChaLearn Gesture Challenge

    以下转自: http://blog.csdn.net/qq1175421841/article/details/50312565 像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的 ...

  9. Appium绑定

    锁定 锁定屏幕 # python driver.lock(5) 将 app 置于后台 把当前应用放到后台去 # python driver.background_app(5) 收起键盘 收起键盘 # ...

随机推荐

  1. linux c编程:线程退出

    在线程创建的时候pthread_exit都是调用的固定参数,我们先来看下如果用自动变量作为pthread_exit的参数时出现的问题 typedef struct foo{ int a; int b; ...

  2. android禁止横屏

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

  3. 使用documentFragment

    function insertHtml(range, val) { var doc = range.doc, frag = doc.createDocumentFragment(); K('@' + ...

  4. jquery跟DOM转换

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  5. 3.09课·········for循环

    for循环:反复执行某段代码.for循环四要素:初始条件,循环条件,循环体,状态改变.for(初始条件;循环条件;状态改变){ 循环体} 若初始条件满足循环条件,则进入循环体,执行完循环体,跳回到状态 ...

  6. linux常用端口

    linux常用端口:已有的比较好的博客! 本人常用端口备份: 50070 hdfs hdfs集群监控端口 8088 yarn yarn集群监控端口 8983 solr solr服务查询端口60010 ...

  7. Unity Json解析IPA

    今天看到一个unity 自带的解析json的IPA,感觉比litjson好用很多,废话不多,上代码 using System.Collections; using System.Collections ...

  8. requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的.如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于request ...

  9. XP最高支持IE8

    1.https://www.microsoft.com/zh-CN/download/details.aspx?id=24488 适用于 Windows XP 的 Internet Explorer ...

  10. Linux - xshell上传文件报错乱码

    xshell上传文件报错乱码,解决方法 rz -be 回车 下载sz  filename