2016-04-26 37 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個viewpagers,我同步。一個包含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,並在點擊時作出反應,如果它實際上是點擊事件。拖動檢測通過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