ViewPager 이중 끼 워 넣 은 미끄럼 문제 해결

4145 단어 기술.
원문 인용:http://www.imhdr.com/android/solve-problems-viewpager-sliding-double-nested/
해결 방법 1:부모 ViewPager 컨트롤 로 사용자 정의
public class ParentViewPager extends ViewPager{
    private int childVPHeight=0;
    public ParentViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        init(context);
    }

    public ParentViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        init(context);
    }

    private void init(Context context) {
        // TODO Auto-generated method stub
        //       
        WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
        int disWidth = windowManager.getDefaultDisplay().getWidth();
        //          dp    px 
        childVPHeight=(int) (context.getResources().getDisplayMetrics().density  * disWidth + 0.5f);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // TODO Auto-generated method stub
        //    ViewPager       ViewPager       
        //  false,             ViewPager
        if(getCurrentItem()==1 && arg0.getY()

이 방법 은 간단 하지만 나타 날 수 있 습 니 다.하위 ViewPager 가 ScrollView 일 때 하위 ViewPager 는 보이 지 않 는 곳 까지 미 끄 러 졌 지만 설정 한 높이 에서 부모 ViewPager 가 좌우 로 미 끄 러 지지 않도록 설정 합 니 다.onTouch 의 동작 은 부모 Viewpager 를 통 해 하위 컨트롤 로 전 달 됩 니 다.
**해결 방법 2:사용자 정의 Viewpager 를 하위 컨트롤 로**
public class ChildViewPager extends ViewPager{
    /**         **/
    PointF downP = new PointF();
    /**         **/
    PointF curP = new PointF(); 
    OnSingleTouchListener onSingleTouchListener;

    public ChildViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public ChildViewPager(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        // TODO Auto-generated method stub
        //               ,  true,
        //   onTouch      ,        onTouchEvent
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent arg0) {
        // TODO Auto-generated method stub
        //    onTouch             
        curP.x = arg0.getX();
        curP.y = arg0.getY();

        if(arg0.getAction() == MotionEvent.ACTION_DOWN){
            //         
            //      downP = curP ,     curP   ,downP    
            downP.x = arg0.getX();
            downP.y = arg0.getY();
            //            ViewPager            ,           
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        if(arg0.getAction() == MotionEvent.ACTION_MOVE){
            //            ViewPager            ,           
            getParent().requestDisallowInterceptTouchEvent(true);
        }

        if(arg0.getAction() == MotionEvent.ACTION_UP){
            // up                 
            //      ,       ,           ,   onclick
            if(downP.x==curP.x && downP.y==curP.y){
                onSingleTouch();
                return true;
            }
        }

        return super.onTouchEvent(arg0);
    }

        /**
     *   
     */
    public void onSingleTouch() {
        if (onSingleTouchListener!= null) {

            onSingleTouchListener.onSingleTouch();
        }
    }

    /**
     *         
     * @author wanpg
     *
     */
    public interface OnSingleTouchListener {
        public void onSingleTouch();
    }

    public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
    }

}

왜 스스로 onSingleTouch 를 정의 합 니까?
ViewPager 의 onTouch Event 에서 저 는 onDown 을 조 작 했 기 때문에 조작 을 한 후에 touch 사건 을 onClick 과 그 내부 컨트롤 에 계속 전달 할 수 없 었 기 때문에 스스로 판단 하여 singleTouch 를 통 해 클릭 을 실현 하 는 사건 을 만 들 었 습 니 다.
방법 2.이중 ViewPager 내장 후 하위 ViewPager 의 터치 슬라이딩 문 제 를 완벽 하 게 해결 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기