Scrollview回弹效果自定义控件
public class MyScrollview extends ScrollView { //要操作的布局 private View innerView; private float y; private Rect normal = new Rect(); private boolean animationFinish = true; public MyScrollview(Context context) { super(context, null); } public MyScrollview(Context context, AttributeSet attrs) { super(context, attrs); } public MyScrollview(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { int childCount = getChildCount(); if (childCount > 0) { innerView = getChildAt(0); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (innerView == null) { return super.onTouchEvent(ev); } else { commonTouchEvent(ev); } return super.onTouchEvent(ev); } /** * 自定义touch事件处理 * * @param ev */ private void commonTouchEvent(MotionEvent ev) { if (animationFinish) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: y = ev.getY(); break; case MotionEvent.ACTION_MOVE: float preY = y == 0 ? ev.getY() : y; float nowY = ev.getY(); int detailY = (int) (preY - nowY); y = nowY; //操作view进行拖动detailY的一半 if (isNeedMove()) { //布局改变位置之前,记录一下正常状态的位置 if (normal.isEmpty()) { normal.set(innerView.getLeft(), innerView.getTop(), innerView.getRight(), innerView.getBottom()); } innerView.layout(innerView.getLeft(), innerView.getTop() - detailY / 2, innerView.getRight(), innerView.getBottom() - detailY / 2); } break; case MotionEvent.ACTION_UP: y = 0; //布局回滚到原来的位置 if (isNeedAnimation()) { animation(); } break; } } } private void animation() { TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - innerView.getTop()); ta.setDuration(200); ta.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { animationFinish = false; } @Override public void onAnimationEnd(Animation animation) { innerView.clearAnimation(); innerView.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); animationFinish = true; } @Override public void onAnimationRepeat(Animation animation) { } }); innerView.startAnimation(ta); } /** * 判断是否需要回滚 * * @return */ private boolean isNeedAnimation() { return !normal.isEmpty(); } /** * 判断是否需要移动 * * @return */ private boolean isNeedMove() { int offset = innerView.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); Log.e("zoubo", "getMeasuredHeight:" + innerView.getMeasuredHeight() + "----getHeight:" + getHeight()); Log.e("zoubo", "offset:" + offset + "----scrollY:" + scrollY); if (scrollY == 0 || scrollY == offset) { return true; } return false; } }
Scrollview回弹效果自定义控件的更多相关文章
- Android仿IOS回弹效果 ScrollView回弹 总结
Android仿IOS回弹效果 ScrollView回弹 总结 应项目中的需求 须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些 发现总 ...
- 阻尼回弹效果的ScrollView嵌套GridView
以前写过一篇带阻尼回弹效果的ScrollView,但是有些小问题,于是又重新整理了一下,这篇文章一是一个带阻尼的Scrollview,再个就是Scrollview嵌套GridView实现,而GridV ...
- ScrollView的阻尼回弹效果实现(仿qq空间)
玩过新浪微博,qq空间等手机客户端的童鞋,都应该清楚,在主界面向下滑动时,会有一个阻尼回弹效果,看起来挺不错,接下来我们就来实现一下这种效果,下拉后回弹刷新界面,先看效果图: 这个是编辑器里面的界面效 ...
- ScrollView的顶部下拉和底部上拉回弹效果
要实现ScrollView的回弹效果,需要对其进行触摸事件处理.先来看一下简单的效果: 根据Android的View事件分发处理机制,下面对dispatchTouchEvent进行详细分析: 在加载布 ...
- 移动端页面 弹出框滚动,底部body锁定,不滚动 / 微信网页禁止回弹效果
需求:页面有弹出层菜单,当弹出层菜单超出屏幕可视区域时,不能滚动.加上滚动后,底部body的滚动事件如何禁止,加上了overflow:hidden;还是不可用. 如下图:地区弹出框可以滚动,而底部的b ...
- -webkit-overflow-scrolling 与滚动回弹效果.
参考来源:https://developer.mozilla.org/zh-CN/docs/Web/CSS/-webkit-overflow-scrolling https://www.w3cways ...
- 源生js惯性滚动与回弹效果
在写移动端的APP或者页面时,经常会遇到惯性滚动与回弹效果.用插件iscroll可以轻松解决这个问题,大多数的移动框架也能轻松解决这个问题,它们内部都封装了这个效果. 一直好奇这个效果原生JS是怎么实 ...
- WPF 扩大,回弹效果
原文:WPF 扩大,回弹效果 <Window x:Class="Fish.AccountBook.View.Test.PanelWindow" xmlns="htt ...
- Android使用TextView实现跑马灯效果(自定义控件)
对于一个长的TetxView 折行显示是一个很好的办法,另一种方法就是跑马灯显示(单行滚动) 1.折行显示的长TextView <LinearLayout xmlns:android=" ...
随机推荐
- Content Provider 小结
Android中的四大组件之一ContentProvider,它支持多个应用间进行存储和读取数据等操作,实现不同应用间的数据共享. ContentProvider,解释为内容提供商.顾名思义,就是对外 ...
- 负载均衡 LVS+Keepalived
系统 CentOS 5.6 X64 物理机 IP 10.10.10.104 Xen : 三台 CentOS 5.8 ip为: 10.10.10.106 10.10.10.107 ...
- [iOS Animation]-CALayer 图层性能
图层性能 要更快性能,也要做对正确的事情. ——Stephen R. Covey 在第14章『图像IO』讨论如何高效地载入和显示图像,通过视图来避免可能引起动画帧率下降的性能问题.在最后一章,我们将着 ...
- Mac快速查看某条命令的版本和存放的位置(ls -l `which mvn`)
输入: ls -l `which mvn` 如图:
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- smarty3-笔记
smarty3笔记 1.Samrty.class.php 的compile_dir 和template_dir类属性 是private的,setTemplateDir和setCompileDir类方法 ...
- ARM的启动代码(1):介绍(转)
源:ARM的启动代码(1):介绍 很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了.究其原因,还是对芯片的启动地址.启动方式.bootloader和操作系统的衔接出了问题.今天就 ...
- STM32F103外部中断编程
STM32F103外部中断编程 中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活. 单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的 ...
- leetcode-006 detect cycle
package leetcode; public class DetectCycle { public ListNode detectCycle(ListNode head) { ListNode s ...
- [Angular Tutorial] 14 -Animations
在这一步中,我们将会通过在我们先前创建的模板代码中添加CSS和JavaScript动画效果来扩展我们的web应用. ·我们现在使用ngAnimate模块来允许动画效果贯穿整个应用. ·我们也依赖于自带 ...