本文在http://gundumw100.iteye.com/blog/1075286的基础上稍作修改

实现了当手指滑动到ScrollView的顶部、底部时,

可以继续的向上、向下拉伸。当释放手指的时候,向上、下弹回。

效果如图所示:

主要代码:

  1. public class ElasticScrollView extends ScrollView {
  2. private View inner;
  3. private float y;
  4. private Rect normal = new Rect();
  5. private boolean animationFinish = true;
  6. public ElasticScrollView(Context context) {
  7. super(context);
  8. }
  9. public ElasticScrollView(Context context, AttributeSet attrs) {
  10. super(context, attrs);
  11. }
  12. @Override
  13. protected void onFinishInflate() {
  14. if (getChildCount() > 0) {
  15. inner = getChildAt(0);
  16. }
  17. }
  18. @Override
  19. public boolean onInterceptTouchEvent(MotionEvent ev) {
  20. return super.onInterceptTouchEvent(ev);
  21. }
  22. @Override
  23. public boolean onTouchEvent(MotionEvent ev) {
  24. if (inner == null) {
  25. return super.onTouchEvent(ev);
  26. } else {
  27. commOnTouchEvent(ev);
  28. }
  29. return super.onTouchEvent(ev);
  30. }
  31. public void commOnTouchEvent(MotionEvent ev) {
  32. if (animationFinish) {
  33. int action = ev.getAction();
  34. switch (action) {
  35. case MotionEvent.ACTION_DOWN:
  36. //              System.out.println("ACTION_DOWN");
  37. y = ev.getY();
  38. super.onTouchEvent(ev);
  39. break;
  40. case MotionEvent.ACTION_UP:
  41. //              System.out.println("ACTION_UP");
  42. y = 0;
  43. if (isNeedAnimation()) {
  44. animation();
  45. }
  46. super.onTouchEvent(ev);
  47. break;
  48. case MotionEvent.ACTION_MOVE:
  49. //              System.out.println("ACTION_MOVE");
  50. final float preY = y == 0 ? ev.getY() : y;
  51. float nowY = ev.getY();
  52. int deltaY = (int) (preY - nowY);
  53. // 滚动
  54. //              scrollBy(0, deltaY);
  55. y = nowY;
  56. // 当滚动到最上或者最下时就不会再滚动,这时移动布局
  57. if (isNeedMove()) {
  58. if (normal.isEmpty()) {
  59. // 保存正常的布局位置
  60. normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());
  61. }
  62. // 移动布局
  63. inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);
  64. } else {
  65. super.onTouchEvent(ev);
  66. }
  67. break;
  68. default:
  69. break;
  70. }
  71. }
  72. }
  73. // 开启动画移动
  74. public void animation() {
  75. // 开启移动动画
  76. TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());
  77. ta.setDuration(200);
  78. ta.setAnimationListener(new AnimationListener() {
  79. @Override
  80. public void onAnimationStart(Animation animation) {
  81. animationFinish = false;
  82. }
  83. @Override
  84. public void onAnimationRepeat(Animation animation) {
  85. }
  86. @Override
  87. public void onAnimationEnd(Animation animation) {
  88. inner.clearAnimation();
  89. // 设置回到正常的布局位置
  90. inner.layout(normal.left, normal.top, normal.right, normal.bottom);
  91. normal.setEmpty();
  92. animationFinish = true;
  93. }
  94. });
  95. inner.startAnimation(ta);
  96. }
  97. // 是否需要开启动画
  98. public boolean isNeedAnimation() {
  99. return !normal.isEmpty();
  100. }
  101. // 是否需要移动布局
  102. public boolean isNeedMove() {
  103. int offset = inner.getMeasuredHeight() - getHeight();
  104. int scrollY = getScrollY();
  105. if (scrollY == 0 || scrollY == offset) {
  106. return true;
  107. }
  108. return false;
  109. }
  110. }

Android自定义控件(二)——有弹性的ScrollView的更多相关文章

  1. android 自定义控件二之仿QQ长按删除

    自定义Dialog 1.先上个效果图:

  2. android自定义控件(二) 入门,继承View

    转载请注明地址:http://blog.csdn.net/ethan_xue/article/details/7313788 ps: 可根据apidemo里LableView,list4,list6学 ...

  3. 老猪带你玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  4. 玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  5. Android自定义控件——有弹性的ListView,ScrollView

    上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性的ScrollView. 国际惯例,效果图: 主要代码: [java] view plaincopy import andr ...

  6. android 有弹性的ScrollView 简单实现,与处理ScrollView和ListView,GridView之间的冲突

    处理ScrollView和ListView,GridView之间的冲突, 最好的办法就是继承这两个类,重写他们的onMeasure方法即可: ListView: import android.widg ...

  7. Android自定义控件(四)——让每一个Activity UI都具有弹性

    前面我们已经介绍了如何让你的ScrollView,ListView具有弹性, 今天,我们在前面的基础上,做一下适当的修改,让那些既不是ScrollView,也不是ListView的Activity页面 ...

  8. Android自定义控件(三)——有弹性的ListView

    上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性的ScrollView. 国际惯例,效果图: 主要代码: import android.content.Context; i ...

  9. 【转】Android自定义控件(三)——有弹性的ListView

    原文地址:http://blog.csdn.net/a105865708/article/details/17959459 上一次我们试验了有弹性的ScrollView.详情 这一次,我们来试验有弹性 ...

  10. Android自定义控件View(二)继承控件

    在前一篇博客中学习了Android自定义控件View的流程步骤和注意点,不了解的童鞋可以参考Android自定义控件View(一).这一节开始学习自定义控件View(二)之继承系统已有的控件.我们来自 ...

随机推荐

  1. license文件生成原理

      byte解密weblogic加密oraclehex 现在很多J2EE应用都采用一个license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的license文件对系统进行限制,比如试 ...

  2. Word03-文档中的截图显示不全

    今天写文档时遇到个很蛋疼的问题,在doc文档中复制进去的截图总是显示不全,图片上半部分都被文字遮盖了,折腾半天,最后还是网上找到了答案. 解决方法如下: 将图片所在行的段落行距修改为其它值即可,原来为 ...

  3. SQL自连接(源于推荐算法中的反查表问题)

    ”基于用户的协同过滤算法“是推荐算法的一种,这类算法强调的是:把和你有相似爱好的其他的用户的物品推荐给你. 要实现该推荐算法,就需要计算和你有交集的用户,这就要用到物品到用户的反查表. 先举个例子说明 ...

  4. progit-zh(Git中文文档)

    发现好像在墙外,还是下载下来看会快点 链接: http://pan.baidu.com/s/1o8EiDMq 密码: vzf9

  5. VC++深入详解读书笔记-第六章菜单

    1.MFC都是采用大写字母来标识资源ID号. 2.程序中会用到多种资源,在为资源确定其ID号时,为了明确区分资源类型,一般都遵循这样一个原则:在“ID”字符串后加上一个标识资源类型的字母,例如,我们给 ...

  6. 翻译:《What can I hold you with?》—— 博尔赫斯《英文诗两首》之一。

    What can I hold you with? 我拿什么才能留住你? I offer you lean streets, desperate sunsets, the moon of the ja ...

  7. jQuery 2.2 和 1.12 新版本发布

    新年新气象,jQuery 团队于昨日发布了两个新版本:1.12 和 2.2.这两个版本都包含了大量的Bug修正和功能改进.基本上这会是3.0之前最后一次发布.不过由于3.0不做向下兼容,所以届时 jQ ...

  8. android手电筒开发

    最近学习android开发,记录学习过程,分享一写小案例 一. 如下先设置好布局文件 <TextView android:id="@+id/textView1" androi ...

  9. 类和对象:面向对象编程 - 零基础入门学习Python037

    类和对象:面向对象编程 让编程改变世界 Change the world by program 经过上节课的热身,相信大家对类和对象已经有了初步的认识,但似乎还是懵懵懂懂:好像面向对象编程很厉害,但不 ...

  10. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...