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程序设计有所帮助。