У меня есть родительское представление, которое должно следовать прикосновению пальца, и дочернее представление внутри него, которое можно щелкнуть. Поэтому я использовал onInterceptTouchEvent, чтобы решить, должен ли я использовать событие касания для родительского или дочернего элемента, сравнивая расстояние касания до ACTION_UP.
очевидно, я использовал «rerun false» для ACTION_DOWN в onInterceptTouchEvent (потому что слишком рано распространять событие перед вычислениями). К сожалению, 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;
}
и это онтач, который определен вне объекта (встроен в программу)
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;
}
});