天天看点

ViewPager嵌套ScrollView与ViewPager兼容问题

主布局

<LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">
           
            <android.support.v4.view.ViewPager
                    android:id="@+id/today_main_vp"
                    android:overScrollMode="never"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>
           

内容布局其他的自己添加

<ScrollView
        android:id="@+id/view_main_sv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none" >

        <LinearLayout
            android:id="@+id/main_ll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:paddingBottom="@dimen/dp20" >

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="158dp" >

                <com.uedoctor.client.patient.widget.TouchViewPager
                    android:id="@+id/img_play_vp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" >
                </com.uedoctor.client.patient.widget.TouchViewPager>

                <LinearLayout
                    android:id="@+id/img_bottom_ll"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp30"
                    android:layout_alignParentBottom="true"
                    android:layout_centerHorizontal="true"
                    android:gravity="center"
                    android:orientation="horizontal" >
                </LinearLayout>
            </RelativeLayout>

            <LinearLayout
                android:id="@+id/middle_ll"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/dp10"
                android:orientation="horizontal" >
            </LinearLayout>
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#86000000"
        android:gravity="center_vertical"
        android:paddingBottom="@dimen/dp5"
        android:paddingLeft="@dimen/dp15"
        android:paddingRight="@dimen/dp15"
        android:paddingTop="@dimen/dp5" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_noticetop" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/dp15"
            android:alpha="0.6"
            android:ellipsize="end"
            android:singleLine="true"
            android:text="武如意 刚刚荣获了武媚娘称号,大家快来临幸她吧"
            android:textColor="@color/_FFFFFF" />
    </LinearLayout>
           

TouchViewPager 实现

public class TouchViewPager extends ViewPager {

	public TouchViewPager(Context context) {
	    super(context);
	}
	
	public TouchViewPager(Context context, AttributeSet attrs) {
	    super(context, attrs);
	}
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		 ((ViewPager)getRootView().findViewById(R.id.today_main_vp)).requestDisallowInterceptTouchEvent(true);
//		 ((ScrollView)getRootView().findViewById(R.id. view_main_sv)).requestDisallowInterceptTouchEvent(true);
		
		return super.dispatchTouchEvent(ev);
	}
	
	float mLY,mLX,mDX,mDY;
	int mLastAct;
	boolean mIntercept;
	
	@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        
		switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN :
                mDX = mDY = 0f;
                mLX = ev.getX();
                mLY = ev.getY();
 
                break;
 
            case MotionEvent.ACTION_MOVE :
                final float X = ev.getX();
                final float Y = ev.getY();
                mDX += Math.abs(X - mLX);
                mDY += Math.abs(Y - mLY);
                mLX = X;
                mLY = Y;
 
                if (mIntercept && mLastAct == MotionEvent.ACTION_MOVE) {
                	((ScrollView)getRootView().findViewById(R.id. view_main_sv)).requestDisallowInterceptTouchEvent(true);
                    return true;
                }
 
                if (mDX > mDY) {
                    mIntercept = true;
                    mLastAct = MotionEvent.ACTION_MOVE;
                    return false;
                }
 
        }
        mLastAct = ev.getAction();
        mIntercept = false;
        return super.onInterceptTouchEvent(ev);
    }
           

估计有些小bug 请留言讨论

谢谢