希望你能够写下我即将写的这篇文章。 因此,我的onTouchListener应该允许在长按后移动视图。
我最初创建它以便视图在event.ACTION_DOWN上将其自身从容器中移除,并将自身附加到包含所有其他此类子视图及其容器的FrameLayout,然后在ACTION_MOVE事件中相应地移动其边距。
这就像一个魅力,但我需要在长时间按下之后允许这种行为,所以我这样做了:
case MotionEvent.ACTION_DOWN:
mainFrame.requestDisallowInterceptTouchEvent(true);
h=new Handler();
viewCopy=view;
eventCopy=event;
h.postDelayed(new Runnable() {
@Override
public void run() {
enableMoving();
}
}, 3000);
break;
除此之外,这个功能"使移动"将volatile布尔值更改为true,在ACTION_MOVE事件中检查:
case MotionEvent.ACTION_MOVE:
System.out.println("move event!");
if(!isMoving) break;
System.out.println("allowing movement!");
//rest of code..
问题是,如果直接从ACTION_DOWN事件调用,同样的函数执行此操作并且事件保持正常进行,而当从处理程序调用时,触摸事件停止(我得到ACTION_CANCEL回调...)。 我已经缩小了执行该操作的确切代码行,即从容器中删除视图并再次添加的代码:
container.removeView(viewCopy);
viewCopy.setLayoutParams(frameParams);
mainFrame.addView(viewCopy);
请帮忙!
答案 0 :(得分:0)
嗯.. Sir leo,你的代码随时调用ACTION_DOWN你创建h=new Handler();
,它会在3秒后执行,假设我在不到一秒的时间内点击了两次视图我有2个处理程序将执行3秒演替。如果发生这种情况,您只能引用第二个处理程序,并从您提供的有限信息中
除此之外,这个函数“启用移动”将一个volatile布尔值更改为true,这在ACTION_MOVE事件中被检查:
我希望您在代码中看到过漏洞/错误?
答案 1 :(得分:0)
如果将来有人尝试这样的事情,似乎在任何一段代码中移动视图我们正在听取另一个父母的触摸事件,除非在听众内部onTouch方法触发ACTION_CANCEL事件。