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)