2012-06-06 4 views
4

Я пробую эту дикую идею, поставив пользовательский элемент управления в элементы определенного вида списка. Управление только «активировано», если пользователь прикасается к определенной точке запуска, а затем может «перетаскивать».Захват событий касания в элементе списка android и предотвращение прокрутки

Мой вопрос: что я могу сделать в onTouchEvent (...), чтобы предотвратить получение списка и прокрутку списка. Прямо сейчас я могу прикоснуться к элементу управления и получить контроль над ним, но если я слишком сильно перемещаю свой палец вверх или вниз, список просматривает и начинает прокрутку, тогда мое представление даже не получает событие ACTION_UP.

Вот мой текущий код onTouchEvent:

if (e.getAction() == MotionEvent.ACTION_DOWN) { 

    Log.d("SwipeView", "onTouchEvent - ACTION_DOWN" + e.getX() + " " + e.getY());   
    int midX = (int)(this.getWidth()/2); 
    int midY = (int)(this.getHeight()/2); 

    if (Math.abs(e.getX() - midX) < 100 && 
     Math.abs(e.getY() - midY) < 100) { 

     Log.d("SwipeView", "HEY"); 
     setDragActive(true); 

    } 

    this.invalidate(); 
    return true; 

} else if (e.getAction() == MotionEvent.ACTION_MOVE) { 

    _current[0] = e.getX(); 
    _current[1] = e.getY(); 

    this.invalidate(); 
    return true; 

} else if (e.getAction() == MotionEvent.ACTION_UP) { 

    _current[0] = 0; 
    _current[1] = 0; 

    setDragActive(false); 

    this.invalidate(); 
    return true; 

} 

Я уверен, что это имеет какое-то отношение к иерархии событий в некотором роде.

ответ

3

Возможно, это не совсем то, что вы ищете, но вы можете реализовать возможности захвата в своей деятельности. добавить

private View capturedView; 
public void setCapturedView(View view) { this.capturedView = view); } 

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    return (this.capturedView != null) ? 
     this.capturedView.dispatchTouchEvent(event) : 
     super.dispatchTouchEvent(event); 
} 

к вашей деятельности, а затем просто передать свой взгляд на ACTION_DOWN и нуль на ACTION_UP. это не совсем красиво, но оно работает. я уверен, что есть правильный способ сделать это, хотя.