Flash Builder 长按列表 - 移动
Posted
技术标签:
【中文标题】Flash Builder 长按列表 - 移动【英文标题】:Flash Builder Long Press on List - Mobile 【发布时间】:2013-02-06 23:19:30 【问题描述】:我想显示一个列表(在磁贴布局中,但我认为这不会改变任何东西)并打开我长按的磁贴的编辑窗口(即按下至少 1 秒)。计时器启动正常,并且在 1 秒后正确调用了 longPressHandler 事件,但是,选择的对象是我触摸的上一个对象。
例如,假设我点击对象 A,然后长按对象 B:longPressHandler 将在编辑窗口中“打开”对象 A。我已经调试过,我看到我的 List 的 SelectedItem 属性仅在我结束长按后更新(例如,在我拿起手指或松开鼠标按钮后)。有什么办法可以打开当前选中的项吗?
相关Actionscript:
private var longPressTimer:Timer = new Timer(1000,1);
private function startLongPressMouse(event:MouseEvent):void
startLongPressTimer();
list.addEventListener(MouseEvent.MOUSE_MOVE, endLongPressMouse);
private function endLongPressMouse(event:MouseEvent):void
stopLongPressTimer();
enableClick();
list.removeEventListener(MouseEvent.MOUSE_MOVE, endLongPressMouse);
private function startLongPress(event:TouchEvent):void
startLongPressTimer();
list.addEventListener(TouchEvent.TOUCH_MOVE, endLongPress);
private function endLongPress(event:TouchEvent):void
stopLongPressTimer();
enableClick();
list.removeEventListener(TouchEvent.TOUCH_MOVE, endLongPress);
private function startLongPressTimer():void
longPressTimer.start();
longPressTimer.addEventListener(TimerEvent.TIMER_COMPLETE, longPressHandler);
protected function disableClick():void
trace("disable click");
list.removeEventListener(MouseEvent.CLICK, regularClickHander);
public function enableClick():void
list.callLater(list.addEventListener, [MouseEvent.CLICK, regularClickHander]);
public function resetListSelection():void
list.selectedIndex = -1;
list.validateDisplayList();
private function stopLongPressTimer():void
longPressTimer.stop();
longPressTimer.reset()
public function longPressHandler(event:TimerEvent):void
disableClick();
stopLongPressTimer();
lblD.text = "Long Press Detected on: " + list.selectedItem.className;
相关MXML:
<s:List id="list" dataProvider="grades" touchBegin="startLongPress(event)" touchEnd="endLongPress(event)"
mouseDown="startLongPressMouse(event)" mouseUp="endLongPressMouse(event)"
labelField="name"
left.landscape="10" right.landscape="20" top.landscape="350" bottom.landscape="20"
left.portrait="20" right.portrait="20" top.portrait="350" bottom.portrait="20">
<s:itemRenderer>
<fx:Component>
<s:ItemRenderer >
<s:Label text="data.className" top="30" horizontalCenter="0" color="#646464"/>
<s:Label text="data.credits" top="50" horizontalCenter="0" color="#646464" fontSize="14"/>
<s:Label text="data.grade" top="100" horizontalCenter="0" color="#646464" fontSize="14"/>
</s:ItemRenderer>
</fx:Component>
</s:itemRenderer>
<s:layout>
<s:TileLayout requestedColumnCount="3" requestedColumnCount.landscape="4" columnAlign="justifyUsingWidth"/>
</s:layout>
</s:List>
我将 longPressHandler 更改为仅显示所选项目的名称,而不是打开编辑窗口。
如果您需要更多信息,请告诉我。提前感谢您的帮助!
【问题讨论】:
+1 获取详细问题。这可能需要一些实验;但我认为您可以在 mouseDown 事件中保存对“悬停”渲染器的访问并将其存储以供以后访问。看“目标”。或者,您可能必须从渲染器中冒泡您自己的事件。 “悬停”渲染器的问题是我正在为移动设备制作这个应用程序,因此没有鼠标。我只有用于测试的鼠标事件处理程序。我会考虑制作自定义事件。感谢您的意见! 在移动设备上的 Flex 中;鼠标事件应该与触摸事件一起触发。 mouse_Move 可能不是正确的;但是 mouseDown 和 MouseUp 应该类似于 TouchStart 和 TouchEnd [我可能对最后一个有误]。但是,根据我自己的经验,对不在移动设备上的移动应用进行任何测试都是浪费时间。 我的意思是触摸没有悬停事件,只有鼠标。之前试过TouchEnd,刚才又重新测试了一下,还是出现了同样的问题。 有没有办法手动更新 touchBegin 上的 list.selectedItem 属性? 【参考方案1】:一种方法是创建一个自定义事件(带有自定义属性),这样您就可以在分派事件时传递您想要的任何数据。
package events;
import flash.events.Event;
public class YourCustomEvent extends Event
public var yourData:Object;
public function YourCustomEvent(type:String, yourData:Object)
super(type);
this.yourData = yourData;
override public function clone():Event
return new YourCustomEvent(type, yourData);
希望对您有所帮助!
PS:我想把它放在评论中,但打字时它变得更大了:)
【讨论】:
以上是关于Flash Builder 长按列表 - 移动的主要内容,如果未能解决你的问题,请参考以下文章
Flash Builder 4.6:在没有设备的情况下测试手势
如何使用 actionscript 在 flash builder 中将背景放在我的 swf 后面?