欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-20 23:27:34
废话不多说了,直接给大家贴代码了,具体代码如下所示: public class bouncebackviewpager extends 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边界回弹效果实例代码,希望对大家有所帮助