首页 > 系统 > Android > 正文

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

2019-10-24 20:34:54
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Android编程ViewPager回弹效果,以实例形式较为详细的分析了ViewPager回弹效果的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

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

 

 
  1. package com.freesonfish.viewpager_2;  
  2. import android.content.Context;  
  3. import android.graphics.Rect;  
  4. import android.support.v4.view.ViewPager;  
  5. import android.util.AttributeSet;  
  6. import android.view.KeyEvent;  
  7. import android.view.MotionEvent;  
  8. import android.view.animation.TranslateAnimation;  
  9. public class MyViewPager extends ViewPager {  
  10. private Rect mRect = new Rect();//用来记录初始位置  
  11. private int pagerCount = 3;  
  12. private int currentItem = 0;  
  13. private boolean handleDefault = true;  
  14. private float preX = 0f;  
  15. private static final float RATIO = 0.5f;//摩擦系数  
  16. private static final float SCROLL_WIDTH = 30f;  
  17. public MyViewPager(Context context) {  
  18. super(context);  
  19. }  
  20. public MyViewPager(Context context, AttributeSet attrs) {  
  21. super(context, attrs);  
  22. }  
  23. //设置总共有多少页,请记得调用它  
  24. public void setpagerCount(int pagerCount) {  
  25. this.pagerCount = pagerCount;  
  26. }  
  27. //这是当前是第几页,请在onPageSelect方法中调用它。  
  28. public void setCurrentIndex(int currentItem) {  
  29. this.currentItem = currentItem;  
  30. }  
  31. @Override 
  32. public boolean dispatchKeyEvent(KeyEvent event) {  
  33. return super.dispatchKeyEvent(event);  
  34. }  
  35. @Override 
  36. public boolean onInterceptTouchEvent(MotionEvent arg0) {  
  37. if (arg0.getAction() == MotionEvent.ACTION_DOWN) {  
  38. preX = arg0.getX();//记录起点  
  39. }  
  40. return super.onInterceptTouchEvent(arg0);  
  41. }  
  42. @Override 
  43. public boolean onTouchEvent(MotionEvent arg0) {  
  44. switch (arg0.getAction()) {  
  45. case MotionEvent.ACTION_UP:  
  46. onTouchActionUp();  
  47. break;  
  48. case MotionEvent.ACTION_MOVE:  
  49. //当时滑到第一项或者是最后一项的时候。  
  50. if ((currentItem == 0 || currentItem == pagerCount - 1)) {  
  51. float nowX = arg0.getX();  
  52. float offset = nowX - preX;  
  53. preX = nowX;  
  54. if (currentItem == 0) {  
  55. if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值  
  56. whetherConditionIsRight(offset);  
  57. else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况  
  58. if (getLeft() + (int) (offset * RATIO) >= mRect.left) { 
  59. layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());  
  60. }  
  61. }  
  62. else {  
  63. if (offset < -SCROLL_WIDTH) {  
  64. whetherConditionIsRight(offset);  
  65. else if (!handleDefault) {  
  66. if (getRight() + (int) (offset * RATIO) <= mRect.right) {  
  67. layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());  
  68. }  
  69. }  
  70. }  
  71. else {  
  72. handleDefault = true;  
  73. }  
  74. if (!handleDefault) {  
  75. return true;  
  76. }  
  77. break;  
  78. default:  
  79. break;  
  80. }  
  81. return super.onTouchEvent(arg0);  
  82. }  
  83. private void whetherConditionIsRight(float offset) {  
  84. if (mRect.isEmpty()) {  
  85. mRect.set(getLeft(), getTop(), getRight(), getBottom());  
  86. }  
  87. handleDefault = false;  
  88. layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());  
  89. }  
  90. private void onTouchActionUp() {  
  91. if (!mRect.isEmpty()) {  
  92. recoveryPosition();  
  93. }  
  94. }  
  95. private void recoveryPosition() {  
  96. TranslateAnimation ta = null;  
  97. ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);  
  98. ta.setDuration(300);  
  99. startAnimation(ta);  
  100. layout(mRect.left, mRect.top, mRect.right, mRect.bottom);  
  101. mRect.setEmpty();  
  102. handleDefault = true;  
  103. }  

看吧,很简单的,如果大家还有什么方法,可以多多交流。

希望本文所述对大家Android程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表