当前位置: 移动技术网 > 移动技术>移动开发>Android > Android编程ViewPager回弹效果实例分析

Android编程ViewPager回弹效果实例分析

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文实例讲述了android编程viewpager回弹效果。分享给大家供大家参考,具体如下:

其实在我们很多应用中都看到当viewpager滑到第一页或者最后一页的时候,如果再滑动的时候,就会有一个缓冲的过程,也就是回弹效果。之前在研究回弹效果的时候,也顺便实现了viewpager的回弹效果,其实也很简单,一下是实现代码,注释比较少:

package com.freesonfish.viewpager_2; 
import android.content.context; 
import android.graphics.rect; 
import android.support.v4.view.viewpager; 
import android.util.attributeset; 
import android.view.keyevent; 
import android.view.motionevent; 
import android.view.animation.translateanimation; 
public class myviewpager extends viewpager { 
  private rect mrect = new rect();//用来记录初始位置 
  private int pagercount = 3; 
  private int currentitem = 0; 
  private boolean handledefault = true; 
  private float prex = 0f; 
  private static final float ratio = 0.5f;//摩擦系数 
  private static final float scroll_width = 30f; 
  public myviewpager(context context) { 
    super(context); 
  } 
  public myviewpager(context context, attributeset attrs) { 
    super(context, attrs); 
  } 
  //设置总共有多少页,请记得调用它 
  public void setpagercount(int pagercount) { 
    this.pagercount = pagercount; 
  } 
  //这是当前是第几页,请在onpageselect方法中调用它。 
  public void setcurrentindex(int currentitem) { 
    this.currentitem = currentitem; 
  } 
  @override 
  public boolean dispatchkeyevent(keyevent event) { 
    return super.dispatchkeyevent(event); 
  } 
  @override 
  public boolean onintercepttouchevent(motionevent arg0) { 
    if (arg0.getaction() == motionevent.action_down) { 
      prex = arg0.getx();//记录起点 
    } 
    return super.onintercepttouchevent(arg0); 
  } 
  @override 
  public boolean ontouchevent(motionevent arg0) { 
    switch (arg0.getaction()) { 
    case motionevent.action_up: 
      ontouchactionup(); 
      break; 
    case motionevent.action_move: 
      //当时滑到第一项或者是最后一项的时候。 
      if ((currentitem == 0 || currentitem == pagercount - 1)) { 
        float nowx = arg0.getx(); 
        float offset = nowx - prex; 
        prex = nowx; 
        if (currentitem == 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(arg0); 
  } 
  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 = null; 
    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程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网