2016-04-26 8 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つのビューポートを持っています。 1つはCalendarEventViewsを含んでいます。私はonClickとonLongを自分のCalendarEventViewに追加するまで(viewpagerでこれらのリスナーを設定しています)、同期していました。条件付きでモーションイベントを使用する

私の問題は、クリックしてもスクロールすることもできますが、両方ではできないということです。言い換えれば、私はどのようにして私のCalendarEventViewがクリックを消費させるが、その親は動き/スクロールを処理させる。

注:CalendarEventViewと親(ビューページャ)の両方がそれらを受け取っている限り、イベントを処理できるかどうかは関係ありません。

答えて

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