ONInterceptTouchEvent 时丢失 ACTION_DOWN 个参数
Losing ACTION_DOWN parameters when InterceptTouchEvent
我有一个应该跟随手指触摸的父视图和一个可点击的子视图。所以我使用 onInterceptTouchEvent 通过比较 ACTION_UP 之前的触摸距离来决定是否必须在父级或子级上消耗触摸事件。
显然我在 onInterceptTouchEvent 的 ACTION_DOWN 上使用了 "retrun false" (因为在计算之前传播事件还为时过早)所以不幸的是 onTouch 失去了 ACTION_DOWN.
问题是如何从 onTouch(而不是 onInterceptTouchEvent)初始化参数(以及父视图的初始位置)?
脚注:出于某种原因,我必须将 onTouch 与我在对象定义中实现 onInterceptTouchEvent 的其他代码内联。
对象定义的一部分:
boolean mmIsBeingDragged;
float mLastX;
float mStartX;
int mTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop();
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mStartX = mLastX;
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
float xDelta = Math.abs(x - mLastX);
float xDeltaTotal = x - mStartX;
if (Math.abs(xDeltaTotal) > mTouchSlop) {
mmIsBeingDragged = true;
mStartX = x;
return true;
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mmIsBeingDragged = false;
break;
}
return false;
}
这是在对象外部定义的 ontouch(与程序内联)
myview.setOnTouchListener(new OnTouchListener()
{
float curX=0;
float oldX;
float startX;
float delta=0;
float togo;
boolean mIsBeingDragged=false;
int mTouchSlop=ViewConfiguration.get(getActivity()).getScaledTouchSlop();
@Override
public boolean onTouch(final View v, MotionEvent event)
{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Here is the prblem! How to initialize startX?
case MotionEvent.ACTION_MOVE:
curX = event.getRawX();
delta=curX-startX;
togo=oldX+delta;
if (Math.abs(delta) > mTouchSlop) {
mIsBeingDragged=true;
followfingerFunction(v,togo)
return true;
}
break;
case MotionEvent.ACTION_UP:
if (!mIsBeingDragged){v.performClick();}
break;
}
return true;
}
});
只是让你开始接触你的activity。 (我知道它不完美但看起来还可以)。
class ParentView extends ViewGroup (or some other viewGroup) {
int startX;
public int getStartX(){
return startX;
}
}
// 之后只需从 activity 调用 getStartX()。
我有一个应该跟随手指触摸的父视图和一个可点击的子视图。所以我使用 onInterceptTouchEvent 通过比较 ACTION_UP 之前的触摸距离来决定是否必须在父级或子级上消耗触摸事件。
显然我在 onInterceptTouchEvent 的 ACTION_DOWN 上使用了 "retrun false" (因为在计算之前传播事件还为时过早)所以不幸的是 onTouch 失去了 ACTION_DOWN.
问题是如何从 onTouch(而不是 onInterceptTouchEvent)初始化参数(以及父视图的初始位置)?
脚注:出于某种原因,我必须将 onTouch 与我在对象定义中实现 onInterceptTouchEvent 的其他代码内联。
对象定义的一部分:
boolean mmIsBeingDragged;
float mLastX;
float mStartX;
int mTouchSlop=ViewConfiguration.get(getContext()).getScaledTouchSlop();
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastX = event.getX();
mStartX = mLastX;
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
float xDelta = Math.abs(x - mLastX);
float xDeltaTotal = x - mStartX;
if (Math.abs(xDeltaTotal) > mTouchSlop) {
mmIsBeingDragged = true;
mStartX = x;
return true;
}
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
mmIsBeingDragged = false;
break;
}
return false;
}
这是在对象外部定义的 ontouch(与程序内联)
myview.setOnTouchListener(new OnTouchListener()
{
float curX=0;
float oldX;
float startX;
float delta=0;
float togo;
boolean mIsBeingDragged=false;
int mTouchSlop=ViewConfiguration.get(getActivity()).getScaledTouchSlop();
@Override
public boolean onTouch(final View v, MotionEvent event)
{
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Here is the prblem! How to initialize startX?
case MotionEvent.ACTION_MOVE:
curX = event.getRawX();
delta=curX-startX;
togo=oldX+delta;
if (Math.abs(delta) > mTouchSlop) {
mIsBeingDragged=true;
followfingerFunction(v,togo)
return true;
}
break;
case MotionEvent.ACTION_UP:
if (!mIsBeingDragged){v.performClick();}
break;
}
return true;
}
});
只是让你开始接触你的activity。 (我知道它不完美但看起来还可以)。
class ParentView extends ViewGroup (or some other viewGroup) {
int startX;
public int getStartX(){
return startX;
}
}
// 之后只需从 activity 调用 getStartX()。