最近项目里用到了一个开源的仿IOS可弹动的ScrollView,看源代码时发现其实实现原理是用 View动画实现的,每次都播一个动画,最后重新layout这个布局。看到使用了View动画,就有点不想用这个控件了,因为个人感觉View动画,应该是要被淘汰的技术了,于是就自己根据实现原理,重写了一个ScrollView,实现了同样的功能.
思路:利用属性动画,及其View的偏移原理即可实现同样的功能。
代码如下:
/**
* @description 仿IOS有弹性ScrollView
* @author rzq
* @date 2015年9月19日
*/
public class OverScrollView extends ScrollView
{/*** 动画执行时间*/private static final int ANIM_DURING = 300;/*** 最大可拖拽距离 */private static final int MAX_SPAN = 500;private View mContentView;private TimeInterpolator mInterpolator;/*** 是否可上下拉*/private boolean canPullDown;private boolean canPullUp;private float mDownY;private boolean isMove;public OverScrollView(Context context){this(context, null);}public OverScrollView(Context context, AttributeSet attrs){super(context, attrs);}@Overrideprotected void onFinishInflate(){if (getChildCount() > 0){mContentView = getChildAt(0);}}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev){switch (ev.getAction()){case MotionEvent.ACTION_DOWN:mDownY = ev.getY();canPullDown = isCanPullDown();canPullUp = isCanPullUp();break;case MotionEvent.ACTION_MOVE:float moveY = ev.getY();float deltaY = moveY - mDownY;if (deltaY > 10 && canPullDown){if (deltaY >= MAX_SPAN){deltaY = MAX_SPAN;}mContentView.setTranslationY(deltaY);isMove = true;}if (deltaY < -10 && canPullUp){if (deltaY <= -MAX_SPAN){deltaY = -MAX_SPAN;}mContentView.setTranslationY(deltaY);isMove = true;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:/*** 利用动画回到原位置*/if (isMove){scrollToOrginial();}isMove = false;break;}return super.dispatchTouchEvent(ev);}/*** 利用属性动画滚回原位置 */private void scrollToOrginial(){ObjectAnimator anim = ObjectAnimator.ofFloat(mContentView, "translationY", mContentView.getTranslationY(), 0);anim.setDuration(ANIM_DURING);if (mInterpolator != null){anim.setInterpolator(mInterpolator);}anim.start();}/*** 设置动画差值器 */public void setInterpolator(TimeInterpolator interpolator){this.mInterpolator = interpolator;}private boolean isCanPullDown(){return getScrollY() == 0 || mContentView.getHeight() < getHeight() + getScrollY();}private boolean isCanPullUp(){return mContentView.getHeight() <= getHeight() + getScrollY();}
}

用法与普通的ScrollView用法完全一样,类中属性都是用的默认值,如果想动态修改,可以改我自定义属性使用即可。将代码拷贝到项目中即可。

Android仿IOS有弹性ScrollView相关推荐

  1. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  2. android 仿ios带弹簧效果的ScrollView

    说ios的效果确实不错,今天就参照别人的代码,修改bug一箩筐,优化体验一大堆. 废话不多说,上代码: /**  * 仿ios弹簧效果 scrollview 带阻尼  * @author sunxia ...

  3. android rebound平移,Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout

    Android 仿 IOS 拖拽回弹之进阶 ReboundFrameLayout 前言 IOS 拖拽回弹给用户的体验不得不赞然后 Android 原生的 API 各种不支持, 于是乎出现的很多仿 IO ...

  4. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  5. android 布局回弹,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  6. android仿ios弹框_在“提示”框中:iOS外观(在Android上运行),Google Maps作为Time Machine,下载Wii游戏保存...

    android仿ios弹框 Once a week we round up some great reader tips and share them with everyone. Read on t ...

  7. android 密码解锁程序,android 仿ios数字密码解锁界面的实例

    如下所示: 每个Android开发人员都知道,现在android的解锁最常用的就是九宫格解锁,ios的解锁常用的是数字密码解锁.而我们在开发工程中,很多时候,都需要android和ios进行结合.有的 ...

  8. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  9. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  10. Android仿IOS吸边弹簧阻尼移动组件SpringMovingView-自定义view系列(3)

    () Android仿ios吸边弹簧阻尼效果的移动组件SpringMovingView 功能简介 Android技术生活交流 Gif演示 实现步骤 java代码 Android技术生活交流 更多其他页 ...

最新文章

  1. 抛出一个nullpointerexception_Java 14 发布了,再也不怕 NullPointerException 了!
  2. 第八课_采购管理、信息与配置管理
  3. c# 编写自定义异常类
  4. Solr Admin中带高亮查询,带score查询;edismax的mm查询
  5. 格式化网上复制过来的源代码
  6. 轻松访问 Android 系统源码与下载
  7. [20180626]函数与标量子查询14.txt
  8. 高并发程序设计入门(转)
  9. 运动控制卡应用开发教程之Python
  10. minist数据集训练与测试
  11. 《凤凰项目》读书笔记二
  12. VS好用系列之选择性粘贴
  13. python制作工资表_Python实用案例:一秒自动生成工资条。
  14. 计算机的端口以及tcp/ip中的端口
  15. Spring中Bean生命周期、实例化与初始化
  16. 李永乐(七)向量组的秩、矩阵的秩——笔记
  17. 超实数与单子(Monad)
  18. 学习@Transaction异常自动回滚以及手动回滚和回滚部分SQL服务
  19. 女性计算机科学家比例,为何女性IT工作者占比低
  20. Windows2012r2 安装SQLSERVER2017 与 SQLSERVER2016 的错误提示解决KB2919355 以及 KB2919442

热门文章

  1. C#:遍历JObject
  2. Animate:基础学习
  3. Zepto:基础学习
  4. Javascript:基础语法
  5. Openlaye:学习笔记之事件
  6. 用 RSocket 解决响应式服务之间的通讯
  7. 矩阵运算_迹的相关性质
  8. 随手记_PPT设计风格参考
  9. 树莓派4B Ubuntu20.04 ROS2 RTABMAP realsense d455
  10. 【洛谷 1057】传球游戏