本文实例讲述了AndroID编程VIEwPager回d效果。分享给大家供大家参考,具体如下:
其实在我们很多应用中都看到当VIEwPager滑到第一页或者最后一页的时候,如果再滑动的时候,就会有一个缓冲的过程,也就是回d效果。之前在研究回d效果的时候,也顺便实现了VIEwPager的回d效果,其实也很简单,一下是实现代码,注释比较少:
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),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(),getRight(),getBottom()); } handleDefault = false; layout(getleft() + (int) (offset * RATIO),getBottom()); } private voID ontouchActionUp() { if (!mRect.isEmpty()) { recoveryposition(); } } private voID recoveryposition() { TranslateAnimation ta = null; ta = new TranslateAnimation(getleft(),mRect.left,0); ta.setDuration(300); startAnimation(ta); layout(mRect.left,mRect.top,mRect.right,mRect.bottom); mRect.setEmpty(); handleDefault = true; } }
看吧,很简单的,如果大家还有什么方法,可以多多交流。
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android编程ViewPager回d效果实例分析全部内容,希望文章能够帮你解决Android编程ViewPager回d效果实例分析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)