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代码
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:background="@android:color/white"/>
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)=scaledTouchSlop)
{
return true;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
startX = 0f;
startY = 0f;
break;
}
return false;
}
}