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

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

程序员文章站 2023-12-09 21:25:15
本文实例讲述了android编程viewpager回弹效果。分享给大家供大家参考,具体如下: 其实在我们很多应用中都看到当viewpager滑到第一页或者最后一页的时候,...

本文实例讲述了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程序设计有所帮助。