OnInterceptTouchEvent ACTION_UP и ACTION_MOVE никогда не вызываются
Журнал никогда не регистрирует ACTION_UP или ACTION_MOVE (который я удалил из примера кода для сокращения)
Вот моя сокращенная версия кода:
public class ProfileBadgeView extends LinearLayout {
Activity act;
public ProfileBadgeView(Context context) {
super(context);
}
public ProfileBadgeView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ProfileBadgeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void initView(Activity act) {
//..init
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
logIntercept("ACTION DOWN");
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
logIntercept("ACTION_UP");
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
private void logIntercept(Object obj) {
Log.i(this.getClass().getSimpleName() + " INTERCEPT :", obj.toString());
}
}
Ответы
Ответ 1
Ваш метод onInterceptTouchEvent
не вызывается после события ACTION_DOWN
, потому что вы возвращаете метод true
в onTouchEvent
. Таким образом, все остальные события отправляются в onTouchEvent
, а не в onInterceptTouchEvent
:
Использование этой функции требует некоторой осторожности, поскольку она имеет довольно сложную взаимодействие с View.onTouchEvent(MotionEvent), а использование этого требует реализуя этот метод, а также этот правильный. События будут получены в следующем порядке:
Здесь вы получите событие вниз. Событие down будет обработано либо ребенком этой группы представлений, либо предоставленному вашему собственному метод onTouchEvent() для обработки; это означает, что вы должны onTouchEvent(), чтобы вернуть true, поэтому вы будете продолжать видеть остальную часть жест (вместо поиска родительского представления для его обработки). Также, , вернув true из onTouchEvent(), вы не получите никаких следующие события в onInterceptTouchEvent() и все сенсорные обработки должно произойти в onTouchEvent(), как обычно.
http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)