1. 程式人生 > >HorizontalScrollView 中巢狀 viewpager滑動衝突的解決

HorizontalScrollView 中巢狀 viewpager滑動衝突的解決

在 HorizontalScrollView 中巢狀 viewpager,viewpager不會隨手勢滑動,所以要複寫viewpager

public class MyViewpager extends ViewPager {
	
	MyViewpager viewpager;
	private int size = -1;
	
	public MyViewpager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        // TODO Auto-generated constructor stub  
    }  
	
	@Override  
    public boolean onInterceptTouchEvent(MotionEvent p_event)  
    {  
        return true;  
    }  
	
	private PointF sp = new PointF(); 
	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		// TODO Auto-generated method stub
		int action = arg0.getAction();
		switch (action){
		case MotionEvent.ACTION_DOWN:
			sp = new PointF(arg0.getX(), arg0.getY());
			break;
		case MotionEvent.ACTION_MOVE:
			PointF ep = new PointF(arg0.getX(), arg0.getY());
			float move_x = sp.x - ep.x;
			if(!(move_x < 0 && getCurrentItem() == 0) && getParent() != null
					&& !(move_x > 0 && getCurrentItem() == getAdapter().getCount() - 1) 
					&& sp.x > 50){
				Log.i("DEBUG", "intercept move event");  
	            getParent().requestDisallowInterceptTouchEvent(true);
			}
		
		}
		
		return super.onTouchEvent(arg0);
	}
	
	


}

在手指滑動時進行判斷,當不是第一頁且向右滑動,也不是最後一頁且向左滑動,並且ACTION_DOWN在x軸為50以上的viewpager可自行滑動
package com.example.viewhortest;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;

import com.mylogin.update.view.MyViewpager;
import com.mylogin.update.view.SlidingMenu;

public class MainActivity extends Activity {

	private MyViewpager vp_start;
	private ArrayList<View> views;
	private SlidingMenu mLeftMenu ; 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		initViewPager();
    }

    private void initViewPager() {
    	mLeftMenu = (SlidingMenu) findViewById(R.id.id_menu);
		vp_start = (MyViewpager)findViewById(R.id.vp_start);
		views = new ArrayList<View>();
		LayoutInflater inflater = getLayoutInflater();

		views.add(inflater.inflate(R.layout.ss1, null));
		views.add(inflater.inflate(R.layout.ss2, null));
		views.add(inflater.inflate(R.layout.ss3, null));
		views.add(inflater.inflate(R.layout.ss4, null));
		vp_start.setAdapter(new MyViewPager(views));
//		vp_start.requestDisallowInterceptTouchEvent(true);
//		vp_start.setOnTouchListener(new MyOntouch());
		
	}

    class MyViewPager extends PagerAdapter {
		public ArrayList<View> list;

		public MyViewPager(ArrayList<View> list) {
			this.list = list;
		}
		
		@Override
		public int getCount() {
			
			return list.size();
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			container.addView(list.get(position), 0);

			
			return list.get(position);
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView(list.get(position));
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

	}
    
}

這裡是main方法。

解壓壓縮包以後,右鍵TEST,Properties-->Android,,將Is Library勾上,

然後將右鍵ViewHorTest,Properties-->Android-->ADD,將Test勾上就行了。

SlidingMenu是我借鑑了慕課網的視訊搞得,地址在這兒

裡邊有方法的詳細說法,我就不寫了。

資源地址