Android SlidingTabLayout+不可手动横向滑动的ViewPager

Android 提供的API例子程序中有个自定义View,SlidingTabLayout+SlidingTabStrip,两者结合构造完美可滑动Tab

主要代码

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.android.common.logger.Log;
import com.example.android.common.view.CustomViewPager;
import com.example.android.common.view.SlidingTabLayout;

public class SlidingTabsBasicFragment extends Fragment {

    static final String LOG_TAG = "SlidingTabsBasicFragment";

    private SlidingTabLayout mSlidingTabLayout;

    private CustomViewPager mViewPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_sample, container, false);
    }

  
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        mViewPager = (CustomViewPager) view.findViewById(R.id.viewpager);
        mViewPager.setAdapter(new SamplePagerAdapter());

        mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
        mSlidingTabLayout.setViewPager(mViewPager);
        
        mViewPager.setCanPageScroll(false);
    }
    
    class SamplePagerAdapter extends PagerAdapter {

        /**
         * @return the number of pages to display
         */
        @Override
        public int getCount() {
            return 10;
        }

        @Override
        public boolean isViewFromObject(View view, Object o) {
            return o == view;
        }
        @Override
        public CharSequence getPageTitle(int position) {
            return "Item " + (position + 1);
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
                    container, false);
            
            TextView title = (TextView) view.findViewById(R.id.item_title);
            title.setText(String.valueOf(position + 1));

            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
            Log.i(LOG_TAG, "destroyItem() [position: " + position + "]");
        }

    }
}

xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

    <com.example.android.common.view.SlidingTabLayout
          android:id="@+id/sliding_tabs"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

    <com.example.android.common.view.CustomViewPager
          android:id="@+id/viewpager"
          android:layout_width="match_parent"
          android:layout_height="0px"
          android:layout_weight="1"
          android:background="@android:color/white"/>

</LinearLayout>

CustomViewPager

package com.example.android.common.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

public class CustomViewPager extends ViewPager {  
  
    private boolean isCanPageScroll = true;
	
    private int scaledTouchSlop = 0;
    
    private float startX = 0f;
    
    private float startY = 0f;
  
    public CustomViewPager(Context context) {  
        this(context,null);  
    }  
  
    public CustomViewPager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        scaledTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop();
    }  
    
    public void setCanPageScroll(boolean isCanScroll){  
        this.isCanPageScroll = isCanScroll;  
    }  
    
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    	if(!isCanPageScroll && interceptTouchEvent(ev))
    	{
    		return true;
    	}
    	return  super.onTouchEvent(ev);
    }
    
    /**
     * 判断是否拦截滑动
     * @param ev
     * @return
     */
	private boolean interceptTouchEvent(MotionEvent ev) 
	{
		float curX = ev.getX();
    	float curY = ev.getY();
    	
    	switch (ev.getAction()) 
    	{
			case MotionEvent.ACTION_DOWN:
				startX = curX;
				startY = curY;
				break;
			case MotionEvent.ACTION_MOVE:
				if(Math.abs(curY-startY)<Math.abs(curX-startX) && Math.abs(curX-startX)>=scaledTouchSlop)
				{
					return true;
				}
				break;
			case MotionEvent.ACTION_UP:
			case MotionEvent.ACTION_CANCEL:
				startX = 0f;
				startY = 0f;
				break;

		}
    	return false;
	}
   
}


你可能感兴趣的:(android,tabwidget)