我有一个父视图,它应该跟随手指触摸并且其中的子视图是可点击的。所以我使用 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;
}
});
答案 0 :(得分:0)
只需将您的mStartX公开给您的活动即可。 (我知道它不完美,但似乎没问题)。
class ParentView extends ViewGroup (or some other viewGroup) {
int startX;
public int getStartX(){
return startX;
}
}
//之后只需从您的活动中调用getStartX()。