ViewPagerサブクラスと親クラスのスライドが競合する場合

2861 ワード

ViewPagerでは、どのようにして子クラスをスライドさせることができますか(親が子クラスを奪わないスライドイベント)?
1、関連する概念方法
Androidシステムの各ViewGroupのサブクラスは、TouchEvent処理に密接に関連する次の3つの方法を有する.
1)public boolean dispatchTouchEvent(MotionEvent ev)この方法はTouchEventを配布するために用いられる
2)public boolean onInterceptTouchEvent(MotionEvent ev)この方法はTouchEventをブロックするために用いられる
3)public boolean onTouchEvent(MotionEvent ev)この方法はTouchEventを処理するために用いられる
注意:すべてのViewのサブクラスではありません.多くのチュートリアルでは、すべてのViewのサブクラスが話されています.中にViewのコントロールを追加してこそ配布する必要があります.例えば、TextView自体が最小のviewなので、サブビューに配布する必要はありません.サブビューもないので、dispatchやInterceptはありません.touchEventだけです.
2、イベントの処理
//          ,  false     ,         viewPager     。  viewPager      
public boolean onInterceptTouchEvent(MotionEvent arg0){

return false;

}

  
//    ,                
//  viewPager      
public boolean dispatchTouchEvent(MotionEvent ev){

getParent().requestDisallowInterceptTouchEvent(true);

    return super.dispatchTouchEvent(ev);
}

より詳細なコード
親ViewPager
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 *       ViewPager
 * 
 * @author Kevin
 * 
 */
public class NoScrollViewPager extends ViewPager {

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

	public NoScrollViewPager(Context context) {
		super(context);
	}

	//         ,   false     ,          viewpager        
	@Override
	public boolean onInterceptTouchEvent(MotionEvent arg0) {
		return false;
	}

	/**
	 *   onTouchEvent  ,      
	 */
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		return false;
	}
}

サブクラスViewPager
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
 * 11         Viewpager,     
 * 
 * @author Kevin
 * 
 */
public class HorizontalViewPager extends ViewPager {

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

	public HorizontalViewPager(Context context) {
		super(context);
	}

	/**
	 *     ,                 
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
//    ,                   
		if (getCurrentItem() != 0) {
			getParent().requestDisallowInterceptTouchEvent(true);//  getParent   ,
																	//    
		} else {//         ,       ,        
			getParent().requestDisallowInterceptTouchEvent(false);//   
		}
		return super.dispatchTouchEvent(ev);
	}

}

まとめ:現在、ViewPagerの中の事件をどのようにブロックするか、ブロックしないかを知っていればいいのですが、深く研究しすぎるとすぐに理解できず、普段の開発で実践する必要があります.上のコードのキーはブロックイベントでonInterceptTouchEventを作成したことですが、disPatchTouchEventはデフォルトfalseであり、このコントロールの内部を識別するイベントは下に配布され続けることができます.
リファレンスリンクhttp://www.cnblogs.com/jqyp/archive/2012/04/25/2469758.html