gt: 			final int index = MotionEventCompat.getActionIndex(ev);
context: /*
   * Copyright (C) 2012 Jake Wharton
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.zsx.widget.viewpager.indicator;
  
  import android.content.Context;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.os.Parcel;
  import android.os.Parcelable;
  import android.support.v4.view.MotionEventCompat;
  import android.support.v4.view.ViewConfigurationCompat;
  import android.support.v4.view.ViewPager;
  import android.util.AttributeSet;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.ViewConfiguration;
  
  /**
   * Draws a line for each page. The current page line is colored differently than
   * the unselected page lines.
   */
  public class Lib_ViewPager_UnderlinePageIndicator extends View implements PageIndicator {
  	private static final int INVALID_POINTER = -1;
  	private static final int FADE_FRAME_MS = 30;
  
  	private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  
  	private boolean mFades;
  	private int mFadeDelay;
  	private int mFadeLength;
  	private int mFadeBy;
  
  	private ViewPager mViewPager;
  	private ViewPager.OnPageChangeListener mListener;
  	private int mScrollState;
  	private int mCurrentPage;
  	private float mPositionOffset;
  
  	private int mTouchSlop;
  	private float mLastMotionX = -1;
  	private int mActivePointerId = INVALID_POINTER;
  	private boolean mIsDragging;
  
  	private final Runnable mFadeRunnable = new Runnable() {
  		@Override
  		public void run() {
  			if (!mFades)
  				return;
  
  			final int alpha = Math.max(mPaint.getAlpha() - mFadeBy, 0);
  			mPaint.setAlpha(alpha);
  			invalidate();
  			if (alpha > 0) {
  				postDelayed(this, FADE_FRAME_MS);
  			}
  		}
  	};
  
  	public Lib_ViewPager_UnderlinePageIndicator(Context context) {
  		super(context);
  		init(context);
  	}
  
  	public Lib_ViewPager_UnderlinePageIndicator(Context context, AttributeSet attrs) {
  		super(context, attrs);
  		init(context);
  	}
  
  	public Lib_ViewPager_UnderlinePageIndicator(Context context, AttributeSet attrs,
  			int defStyle) {
  		super(context, attrs, defStyle);
  		init(context);
  	}
  
  	private void init(Context context) {
  		if (isInEditMode())
  			return;
  		// Load defaults from resources
  		final boolean defaultFades = true;
  		final int defaultFadeDelay = 300;
  		final int defaultFadeLength = 400;
  		final int defaultSelectedColor = Color.parseColor("#FF33B5E5");
  
  		_setFades(defaultFades);
  		_setSelectedColor(defaultSelectedColor);
  		_setFadeDelay(defaultFadeDelay);
  		_setFadeLength(defaultFadeLength);
  
  		final ViewConfiguration configuration = ViewConfiguration.get(context);
  		mTouchSlop = ViewConfigurationCompat
  				.getScaledPagingTouchSlop(configuration);
  	}
  
  	public boolean _getFades() {
  		return mFades;
  	}
  
  	public void _setFades(boolean fades) {
  		if (fades != mFades) {
  			mFades = fades;
  			if (fades) {
  				post(mFadeRunnable);
  			} else {
  				removeCallbacks(mFadeRunnable);
  				mPaint.setAlpha(0xFF);
  				invalidate();
  			}
  		}
  	}
  
  	public int _getFadeDelay() {
  		return mFadeDelay;
  	}
  
  	public void _setFadeDelay(int fadeDelay) {
  		mFadeDelay = fadeDelay;
  	}
  
  	public int _getFadeLength() {
  		return mFadeLength;
  	}
  
  	public void _setFadeLength(int fadeLength) {
  		mFadeLength = fadeLength;
  		mFadeBy = 0xFF / (mFadeLength / FADE_FRAME_MS);
  	}
  
  	public int _getSelectedColor() {
  		return mPaint.getColor();
  	}
  
  	public void _setSelectedColor(int selectedColor) {
  		mPaint.setColor(selectedColor);
  		invalidate();
  	}
  
  	@Override
  	protected void onDraw(Canvas canvas) {
  		super.onDraw(canvas);
  
  		if (mViewPager == null) {
  			return;
  		}
  		final int count = mViewPager.getAdapter().getCount();
  		if (count == 0) {
  			return;
  		}
  
  		if (mCurrentPage >= count) {
  			_setCurrentItem(count - 1);
  			return;
  		}
  
  		final int paddingLeft = getPaddingLeft();
  		final float pageWidth = (getWidth() - paddingLeft - getPaddingRight())
  				/ (1f * count);
  		final float left = paddingLeft + pageWidth
  				* (mCurrentPage + mPositionOffset);
  		final float right = left + pageWidth;
  		final float top = getPaddingTop();
  		final float bottom = getHeight() - getPaddingBottom();
  		canvas.drawRect(left, top, right, bottom, mPaint);
  	}
  
  	@Override
  	public boolean onTouchEvent(MotionEvent ev) {
  		if (super.onTouchEvent(ev)) {
  			return true;
  		}
  		if ((mViewPager == null) || (mViewPager.getAdapter().getCount() == 0)) {
  			return false;
  		}
  
  		final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
  		switch (action) {
  		case MotionEvent.ACTION_DOWN:
  			mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
  			mLastMotionX = ev.getX();
  			break;
  
  		case MotionEvent.ACTION_MOVE: {
  			final int activePointerIndex = MotionEventCompat.findPointerIndex(
  					ev, mActivePointerId);
  			final float x = MotionEventCompat.getX(ev, activePointerIndex);
  			final float deltaX = x - mLastMotionX;
  
  			if (!mIsDragging) {
  				if (Math.abs(deltaX) > mTouchSlop) {
  					mIsDragging = true;
  				}
  			}
  
  			if (mIsDragging) {
  				mLastMotionX = x;
  				if (mViewPager.isFakeDragging() || mViewPager.beginFakeDrag()) {
  					mViewPager.fakeDragBy(deltaX);
  				}
  			}
  
  			break;
  		}
  
  		case MotionEvent.ACTION_CANCEL:
  		case MotionEvent.ACTION_UP:
  			if (!mIsDragging) {
  				final int count = mViewPager.getAdapter().getCount();
  				final int width = getWidth();
  				final float halfWidth = width / 2f;
  				final float sixthWidth = width / 6f;
  
  				if ((mCurrentPage > 0) && (ev.getX() < halfWidth - sixthWidth)) {
  					if (action != MotionEvent.ACTION_CANCEL) {
  						mViewPager.setCurrentItem(mCurrentPage - 1);
  					}
  					return true;
  				} else if ((mCurrentPage < count - 1)
  						&& (ev.getX() > halfWidth + sixthWidth)) {
  					if (action != MotionEvent.ACTION_CANCEL) {
  						mViewPager.setCurrentItem(mCurrentPage + 1);
  					}
  					return true;
  				}
  			}
  
  			mIsDragging = false;
  			mActivePointerId = INVALID_POINTER;
  			if (mViewPager.isFakeDragging())
  				mViewPager.endFakeDrag();
  			break;
  
  		case MotionEventCompat.ACTION_POINTER_DOWN: {
  