1 public class BounceScrollView extends ScrollView {
  2     private View inner;// 孩子View
  3
  4     private float y;// 点击时y坐标
  5
  6     private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)
  7
  8     private boolean isCount = false;// 是否开始计算
  9
 10     public BounceScrollView(Context context, AttributeSet attrs) {
 11         super(context, attrs);
 12     }
 13
 14     /***
 15      * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
 16      * 方法,也应该调用父类的方法,使该方法得以执行.
 17      */
 18     @Override
 19     protected void onFinishInflate() {
 20         if (getChildCount() > 0) {
 21             inner = getChildAt(0);
 22         }
 23     }
 24
 25     /***
 26      * 监听touch
 27      */
 28     @Override
 29     public boolean onTouchEvent(MotionEvent ev) {
 30         if (inner != null) {
 31             commOnTouchEvent(ev);
 32         }
 33
 34         return super.onTouchEvent(ev);
 35     }
 36
 37     /***
 38      * 触摸事件
 39      *
 40      * @param ev
 41      */
 42     public void commOnTouchEvent(MotionEvent ev) {
 43         int action = ev.getAction();
 44         switch (action) {
 45         case MotionEvent.ACTION_DOWN:
 46             break;
 47         case MotionEvent.ACTION_UP:
 48             // 手指松开.
 49             if (isNeedAnimation()) {
 50                 animation();
 51                 isCount = false;
 52             }
 53             break;
 54         /***
 55          * 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到,
 56          * 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始.
 57          * 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行.
 58          */
 59         case MotionEvent.ACTION_MOVE:
 60             final float preY = y;// 按下时的y坐标
 61             float nowY = ev.getY();// 时时y坐标
 62             int deltaY = (int) (preY - nowY);// 滑动距离
 63             if (!isCount) {
 64                 deltaY = 0; // 在这里要归0.
 65             }
 66
 67             y = nowY;
 68             // 当滚动到最上或者最下时就不会再滚动,这时移动布局
 69             if (isNeedMove()) {
 70                 // 初始化头部矩形
 71                 if (normal.isEmpty()) {
 72                     // 保存正常的布局位置
 73                     normal.set(inner.getLeft(), inner.getTop(),
 74                             inner.getRight(), inner.getBottom());
 75                 }
 76 //                Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop()
 77 //                        + "," + inner.getRight() + "," + inner.getBottom());
 78                 // 移动布局
 79                 inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
 80                         inner.getRight(), inner.getBottom() - deltaY / 2);
 81             }
 82             isCount = true;
 83             break;
 84
 85         default:
 86             break;
 87         }
 88     }
 89
 90     /***
 91      * 回缩动画
 92      */
 93     public void animation() {
 94         // 开启移动动画
 95         TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top);
 96         ta.setDuration(200);
 97         inner.startAnimation(ta);
 98         // 设置回到正常的布局位置
 99         inner.layout(normal.left, normal.top, normal.right, normal.bottom);
100
101 //        Log.e("jj", "回归:" + normal.left + "," + normal.top + "," + normal.right
102 //                + "," + normal.bottom);
103
104         normal.setEmpty();
105
106     }
107
108     // 是否需要开启动画
109     public boolean isNeedAnimation() {
110         return !normal.isEmpty();
111     }
112
113     /***
114      * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度
115      *
116      * getHeight():获取的是屏幕的高度
117      *
118      * @return
119      */
120     public boolean isNeedMove() {
121         int offset = inner.getMeasuredHeight() - getHeight();
122         int scrollY = getScrollY();
123 //        Log.e("jj", "scrolly=" + scrollY);
124         // 0是顶部,后面那个是底部
125         if (scrollY == 0 || scrollY == offset) {
126             return true;
127         }
128         return false;
129     }
130
131 }

此View用于,在没有充满父级的时候,下拉会有反弹效果。但是Android自带的ScrollView就不可以。

转载于:https://www.cnblogs.com/royi123/p/4257788.html

ScrollView反弹效果相关推荐

  1. Android之仿美拍主要菜单滑动反弹效果

    本文主要记录一些零碎的东西 先说说要实现的效果: 菜单滑动最左边,还可以拖动一定距离,松开手后,view自动反弹会原位置 主要的坑:控制滑动的view响应touch事件,里面的子view无法响应cli ...

  2. 仿微信图片缩放效果以及listview反弹效果

    这些效果都是基于一些前辈的基础上进行修改的,以满足自己想要的效果,在此对几位前辈表示感谢. 废话不多说了,先上效果图. 因为都是一些动画,图片可能无法看出效果,先说一下主要功能. 1.listview ...

  3. WPF触控程序开发(三)——类似IPhone相册的反弹效果

    原文: WPF触控程序开发(三)--类似IPhone相册的反弹效果 用过IPhone的都知道,IPhone相册里,当图片放大到一定程度后,手指一放,会自动缩回,移动图片超出边框后手指一放,图片也会自动 ...

  4. 捕鱼场景中子弹反弹效果的实现

    捕鱼场景中子弹反弹效果的实现 目录 捕鱼场景中子弹反弹效果的实现 前言 核心代码: 代码分析: 前言 在捕鱼游戏中设计子弹时实现的反弹效果,这里做一个总结,方便以后在其他游戏中要实现同样的功能时查阅参 ...

  5. Unity中子弹反弹效果的制作

    最近在做一个射击游戏,需要做子弹的反弹效果:即当子弹碰撞到物体的时候可以向光线反射一样改变方向射击. 本来是想着可以利用unity自带的物理效果加力加碰撞来做,可是效果不好,不知道是我调的参数不对还是 ...

  6. ios:ScrollView联动效果

    1.简单的效果 简单的代码 2.主要用到scrollViewDidScroll代理方法   代码如下 - (void)scrollViewDidScroll:(UIScrollView *)scrol ...

  7. 聚划算导航栏的反弹效果代码 纯原生js实现

    一.首先是HTML代码:  记得在头部加一个移动端的视口 <header><div class="logo">聚划算</div><div ...

  8. Unity3D_类捕鱼项目,子弹反弹效果实现

    子弹反弹示意图如下: 1.墙体与子弹均为碰撞体 2.前提条件:需要知道子弹前进方向向量,墙体方向向量 3.计算简易过程,黄色为子弹方向向量,计算出与墙的夹角,根据入射角等于反射角算出橙色方向向量.此时 ...

  9. android 列表回弹效果,Android ListView ScrollView回弹效果

    ios中对可以滚动的视图都在系统层面上实现了触碰到边缘的阻尼回弹效果,用户一看便知自己的操作已经到了边界.android中也有类似的方案,不过当到达边界的时候不是用阻尼的方式,而是逐渐显示一个渐变颜色 ...

最新文章

  1. mcDropdown使用方法
  2. 张一鸣的微博世界-产品篇一
  3. 为什么利用多个域名来存储网站资源会更有效?
  4. DreamFactory 第7章 限制和记录API请求
  5. 想了解物联网应用的自动部署,看这篇就够了
  6. PRML学习总结(1)——Introduction
  7. centos安装ab测试工具
  8. Linux 内核 下载 编译 安装 2021 ubuntu
  9. 三角洲并联臂3D打印机入门了解
  10. Notion,一款优秀的程序员记笔记软件,值得推荐!
  11. EXCEL插入超链接——无法打开指定文件
  12. 依赖注入:语法糖胜于功能组合
  13. 二极管和稳压管的区别
  14. 3dMAX+Vary 调节焦散效果爬坑
  15. 8脚51单片机DIY时间显示+闹钟技术分享(一)
  16. ​​商朝是广西骆越人北上建立的政权,是骆越文化的延续
  17. 牛客网剑指offer(Python版)
  18. xml解析方式与效率对比
  19. RabbitMQ交换机类型
  20. SOM自组织(竞争型)神经网络(Python实现)

热门文章

  1. python画海绵宝宝_一步一步教你画章鱼哥怎么画好看?教你学画海绵宝宝的章鱼哥简笔画!...
  2. python不包含某字符,查找不包含某些文本字符串的所有文本文件
  3. C:#define用法
  4. MFC提示 未在此计算机上注册ActiveX控件“{648A5600-2C6E-101B-82B6-000000000014}“完美解决
  5. 腾讯云yum操作实现CentOS 7.6 64位Linux系统图形界面的安装和vnc的搭建
  6. 【模型解读】network in network中的1*1卷积,你懂了吗
  7. 全球及中国煤层气开发产业运营规模与十四五战略决策建议报告2022版
  8. 全球与中国重型离合器市场运营状况分析与“十四五”发展规划建议2021年版
  9. 精准扶贫电商重整流通-农业大健康·李玉庭: 谋定功能农产品
  10. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 17—Large Scale Machine Learning 大规模机器学习...