这篇文章主要介绍了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程序设计有所帮助。
新闻热点
疑难解答