Android实现ViewPager边界回弹效果实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所示:

“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 成都创新互联公司是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于网站设计制作、成都网站建设、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!

public class BounceBackViewPager extends ViewPager {
 private int currentPosition = 0;
 private Rect mRect = new Rect();//用来记录初始位置
 private boolean handleDefault = true;
 private float preX = 0f;
 private static final float RATIO = 0.5f;//摩擦系数
 private static final float SCROLL_WIDTH = 10f;
 public BounceBackViewPager(Context context) {
  super(context);
 }
 public BounceBackViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 @Override
 public boolean dispatchKeyEvent(KeyEvent event) {
  return super.dispatchKeyEvent(event);
 }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_DOWN) {
   preX = ev.getX();//记录起点
   currentPosition = getCurrentItem();
  }
  return super.onInterceptTouchEvent(ev);
 }
 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  switch (ev.getAction()) {
   case MotionEvent.ACTION_UP:
    onTouchActionUp();
    break;
   case MotionEvent.ACTION_MOVE:
    if (getAdapter().getCount() == 1) {
     float nowX = ev.getX();
     float offset = nowX - preX;
     preX = nowX;
     if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值
      whetherConditionIsRight(offset);
     } else if (offset < -SCROLL_WIDTH) {
      whetherConditionIsRight(offset);
     } else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况
      if (getLeft() + (int) (offset * RATIO) != mRect.left) {
       layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
      }
     }
    } else if ((currentPosition == 0 || currentPosition == getAdapter().getCount() - 1)) {
     float nowX = ev.getX();
     float offset = nowX - preX;
     preX = nowX;
     if (currentPosition == 0) {
      if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值
       whetherConditionIsRight(offset);
      } else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况
       if (getLeft() + (int) (offset * RATIO) >= mRect.left) {
        layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
       }
      }
     } else {
      if (offset < -SCROLL_WIDTH) {
       whetherConditionIsRight(offset);
      } else if (!handleDefault) {
       if (getRight() + (int) (offset * RATIO) <= mRect.right) {
        layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
       }
      }
     }
    } else {
     handleDefault = true;
    }
    if (!handleDefault) {
     return true;
    }
    break;
   default:
    break;
  }
  return super.onTouchEvent(ev);
 }
 private void whetherConditionIsRight(float offset) {
  if (mRect.isEmpty()) {
   mRect.set(getLeft(), getTop(), getRight(), getBottom());
  }
  handleDefault = false;
  layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 }
 private void onTouchActionUp() {
  if (!mRect.isEmpty()) {
   recoveryPosition();
  }
 }
 private void recoveryPosition() {
  TranslateAnimation ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);
  ta.setDuration(300);
  startAnimation(ta);
  layout(mRect.left, mRect.top, mRect.right, mRect.bottom);
  mRect.setEmpty();
  handleDefault = true;
 }
}

以上所述是小编给大家介绍的Android 实现ViewPager边界回弹效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对创新互联网站的支持!


文章标题:Android实现ViewPager边界回弹效果实例代码
文章链接:http://scyanting.com/article/pojocj.html