2016-04-26 6 views
0
public class CalendarEventView extends LinearLayout { 
public CalendarEventView(Context context) { 
    super(context); 
} 

public CalendarEventView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CalendarEventView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 

    if((event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP) && event.getAction() != MotionEvent.ACTION_MOVE){ 
     Log.v("move", "click"); 
     return true; 
    } 

    return false; 
} 
} 

У меня есть 2 наблюдателя, которых я синхронизирую. Один содержит CalendarEventViews. Они продолжали синхронизироваться, пока я не добавил onClick и onLongClick в свой CalendarEventView (я установил эти слушатели в viewpager).Условно-бесплатная MotionEvents

Моя проблема заключается в том, что я могу работать только с одним кликом или прокруткой, но не с обоими. Другими словами, как я могу позволить CalendarEventView потреблять клики, но пусть его родительский элемент обрабатывает перемещение/прокрутку.

Примечание. Я не возражаю, если и CalendarEventView, и родительский (viewpager) могут обрабатывать событие, пока они оба его получают.

ответ

0

Попробуйте это:

long eventStarted; 
long threshold = 500; //500ms 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     eventStarted = System.currentTimeMillis(); 
     Log.v("move", "action down"); 
     return (true); 
    case MotionEvent.ACTION_MOVE: 
     return (System.currentTimeMillis() > (eventStarted + threshold)); 
    case MotionEvent.ACTION_UP: 
     if (System.currentTimeMillis() <= (eventStarted + threshold)) { 
     //This is a click 
     } 
     eventStarted = 0; 
     return (true); 
    } 
    return false; 
} 

В основном вы измените значение по умолчанию OnClickListener реализовать свою версию, так что вы не потребляете событие перемещения.

+0

щелкает работают, но не свиток .. – ovg

0

ViewGroup, которая является родительской, получает сначала interceptTouchEvent, а если какой-либо дочерний объект возвращает true, то родитель не получит другие события.

В принципе, вы всегда можете вернуть false и отреагировать на клик, если это событие click. Перетаскивание обнаружено через treshold

+0

я не могу получить эту работу. Возможно ли, чтобы они оба получали событие всегда? – ovg

0

Так что я не мог решить проблему, но нашел альтернативу. Я посмотрел, как я синхронизовал своих зрителей и нашел альтернативу, которая не требует использования сенсорных событий. Мой пользовательский вид выше больше не нужен. Только в случае, если это полезно для кого-то:

 // Synchronise both ViewPagers 
//  headerColumnViewPager.setOnTouchListener(new OnTouchListener() { 
//   @Override 
//   public boolean onTouch(View v, MotionEvent event) { 
//    contentColumnViewPager.onTouchEvent(event); 
//    return false; 
//   } 
//  }); 
//  contentColumnViewPager.setOnTouchListener(new OnTouchListener() { 
//   @Override 
//   public boolean onTouch(View v, MotionEvent event) { 
//    headerColumnViewPager.onTouchEvent(event); 
//    return false; 
//   } 
//  }); 

    headerColumnViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     private int mScrollState = ViewPager.SCROLL_STATE_IDLE; 

     @Override 
     public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) { 
      if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { 
       return; 
      } 
      contentColumnViewPager.scrollTo(headerColumnViewPager.getScrollX(), contentColumnViewPager.getScrollY()); 
     } 

     @Override 
     public void onPageSelected(final int position) { } 

     @Override 
     public void onPageScrollStateChanged(final int state) { 
      mScrollState = state; 
      if (state == ViewPager.SCROLL_STATE_IDLE) { 
       contentColumnViewPager.setCurrentItem(headerColumnViewPager.getCurrentItem(), false); 
      } 
     } 
    }); 

    contentColumnViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     private int mScrollState = ViewPager.SCROLL_STATE_IDLE; 

     @Override 
     public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) { 
      if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { 
       return; 
      } 
      headerColumnViewPager.scrollTo(contentColumnViewPager.getScrollX(), headerColumnViewPager.getScrollY()); 
     } 

     @Override 
     public void onPageSelected(final int position) { } 

     @Override 
     public void onPageScrollStateChanged(final int state) { 
      mScrollState = state; 
      if (state == ViewPager.SCROLL_STATE_IDLE) { 
       headerColumnViewPager.setCurrentItem(contentColumnViewPager.getCurrentItem(), false); 
      } 
     } 
    }); 

Источник: Synchronizing two ViewPagers using OnPageChangeListener