MotionEvent.ACTION_DOWN 即使我 return 是正确的,也没有被调用
MotionEvent.ACTION_DOWN not being called even though I return true for it
我的 LinearLayout
个 ListView
有一个 onTouchListener
,我正在尝试使用 ACTION_DOWN
和 ACTION_UP
数据来检测何时用户滑动到下一个 ListView
。然而,MotionEvent
永远不会等于 ACTION_DOWN
,尽管 ACTION_UP
工作得很好。经过大量谷歌搜索后,我能找到的唯一解决方案是在调用事件时 return true,但我已经在这样做了。这是我的 onTouchListener
代码
View.OnTouchListener mTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
downX = event.getX();
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
upX = event.getX();
if(userSwipedFarEnough)
doStuff()
return true;
}
return false;
}
};
onTouch 根据触摸类型被调用多次,ACTION_DOWN ACTION_UP ACTION_MOVE 所有这些都可能同时发生。我会说取出 else if 并只使用 if 以便它捕获两个动作
我知道发生了什么,我的列表视图的滚动视图以某种方式窃取了 action_down 所以它没有被调用。当我有一个空列表视图并且滚动有效时,我意识到了这一点。
我的解决方案是扩展 ScrollView:
interface MyScrollViewActionDownListener{
fun onActionDown()
}
class MyScrollView: ScrollView
{
private var mActionDownListener: MyScrollViewActionDownListener? = null
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int): super(context, attributeSet, defStyleAttr)
constructor(context: Context):super(context)
constructor(context: Context, attributeSet: AttributeSet):super(context,attributeSet)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if(ev!!.action == MotionEvent.ACTION_DOWN){
mActionDownListener?.onActionDown()
}
return super.onInterceptTouchEvent(ev)
}
fun setActionDownListener(listener: MyScrollViewActionDownListener){
this.mActionDownListener = listener
}
}
我的 LinearLayout
个 ListView
有一个 onTouchListener
,我正在尝试使用 ACTION_DOWN
和 ACTION_UP
数据来检测何时用户滑动到下一个 ListView
。然而,MotionEvent
永远不会等于 ACTION_DOWN
,尽管 ACTION_UP
工作得很好。经过大量谷歌搜索后,我能找到的唯一解决方案是在调用事件时 return true,但我已经在这样做了。这是我的 onTouchListener
代码
View.OnTouchListener mTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
downX = event.getX();
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
upX = event.getX();
if(userSwipedFarEnough)
doStuff()
return true;
}
return false;
}
};
onTouch 根据触摸类型被调用多次,ACTION_DOWN ACTION_UP ACTION_MOVE 所有这些都可能同时发生。我会说取出 else if 并只使用 if 以便它捕获两个动作
我知道发生了什么,我的列表视图的滚动视图以某种方式窃取了 action_down 所以它没有被调用。当我有一个空列表视图并且滚动有效时,我意识到了这一点。
我的解决方案是扩展 ScrollView:
interface MyScrollViewActionDownListener{
fun onActionDown()
}
class MyScrollView: ScrollView
{
private var mActionDownListener: MyScrollViewActionDownListener? = null
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int): super(context, attributeSet, defStyleAttr)
constructor(context: Context):super(context)
constructor(context: Context, attributeSet: AttributeSet):super(context,attributeSet)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
if(ev!!.action == MotionEvent.ACTION_DOWN){
mActionDownListener?.onActionDown()
}
return super.onInterceptTouchEvent(ev)
}
fun setActionDownListener(listener: MyScrollViewActionDownListener){
this.mActionDownListener = listener
}
}