该View转自   http://blog.csdn.net/Kalwang/article/details/4708721  ,感谢这位大神。

 public class BounceBackViewPager extends ViewPager {

     private int currentPosition = 0;
private Rect mRect = new Rect();//用来记录初始位置
private boolean handleDefault = true;
private float preX = 0f;
private static final float RATIO = 0.5f;//摩擦系数
private static final float SCROLL_WIDTH = 10f; public BounceBackViewPager(Context context) {
super(context);
} public BounceBackViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
preX = ev.getX();//记录起点
currentPosition = getCurrentItem();
}
return super.onInterceptTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
onTouchActionUp();
break;
case MotionEvent.ACTION_MOVE:
if (getAdapter().getCount() == 1) {
float nowX = ev.getX();
float offset = nowX - preX;
preX = nowX; if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值
whetherConditionIsRight(offset);
} else 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 ((currentPosition == 0 || currentPosition == getAdapter().getCount() - 1)) {
float nowX = ev.getX();
float offset = nowX - preX;
preX = nowX; if (currentPosition == 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(ev);
} 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 = 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--实现ViewPager边界回弹效果(转)的更多相关文章

  1. Android -- 使用ViewPager实现画廊效果

    1,今天在微信推送文章看到实现画廊效果,感觉挺不错的,就来写写试试,先来看一下效果图: 上面的效果基本上可以用两个功能点来包含:ViewPager的切换动画.ImageView的倒影的实现 嗯,先来将 ...

  2. Android PullToZoomListView实现放大回弹效果

    另外一个相同项目的地址https://github.com/Frank-Zhu/PullZoomView 转自http://blog.csdn.net/wangjinyu501/article/det ...

  3. 禁用ViewPager边界滑动效果(转)

    反射设置方法 private EdgeEffectCompat leftEdge; private EdgeEffectCompat rightEdge; public void DisableLRS ...

  4. Android--ScrollView边界回弹效果

    /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Versi ...

  5. Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 某天看到京东商城首页的滑动广告的Banner,在流动切换的时候有立体的动画效果,感觉很有意思,然后研究了下 ...

  6. Android仿IOS回弹效果 ScrollView回弹 总结

    Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些  发现总 ...

  7. Android 自定义 ViewPager 打造千变万化的图片切换效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主 ...

  8. ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示

    正常情况下, ViewPager 一页只能显示一项数据, 但是我们常常看到网上,特别是电视机顶盒的首页经常出现中间大图显示两端也都露出一点来,这种效果怎么实现呢?先上一张效果图: 大家第一眼肯定想到了 ...

  9. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

随机推荐

  1. MySQL:explain 和 慢查询日志

    1. 执行SQL时显示执行情况 explain + SQL语句 2. 强制使用索引 select  *  from  t  force  index (a)  where  a  between  1 ...

  2. liunx下判断有线网口硬件是否正常的三个常用方式

    第一种,命令法: /mnt/wifi$ cat /proc/net/dev Inter-|  Receive                                              ...

  3. javascript 最全面的数组操作合集

    一.数组添加.删除.替换.截取操作 1.arr.unshift(1) 在数组头部添加一个元素 1 (直接改变原数组,返回值为添加元素后数组的length) 2.arr.shift() 在数组的头部删除 ...

  4. # postgresql-shared_buffers

    关于shared_buffers 什么是shred_buffer,我们为什么需要shared_buffers? 1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘 ...

  5. 使用request爬取拉钩网信息

    通过cookies信息爬取 分析header和cookies 通过subtext粘贴处理header和cookies信息 处理后,方便粘贴到代码中 爬取拉钩信息代码 import requests c ...

  6. GDB查看内存(x 命令)

    gdb查看内存命令 首先使用gdb [YourFileName].c进入gdb界面 使用examine命令,字母缩写为x查看内存地址的值.x命令语法 x/[number][format] <ad ...

  7. CSS--最最最基础操作

    CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. h1 {color:red; font-size:14px;} css的四种引入方式 1.行内式  行内式是在标记的style属性中设定 ...

  8. Spring的Java配置方式—@Configuration和@Bean实现Java配置

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ...

  9. vue-02-安装-指令

    1, vue安装 1), 安装vue-cli npm install -g cnpm --registry=https://registry.npm.taobao.org 之后可以用 淘宝的npm镜像 ...

  10. Configure Many-to-Many relationship:

    Configure Many-to-Many relationship: Here, we will learn how to configure Many-to-Many relationship ...