Android怎么自定义ScrollView实现阻尼回弹
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,今天小编给大家分享一下Android怎么自定义ScrollView实现阻尼回弹的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2026年11月01日Android怎么自定义ScrollView实现阻尼回弹
今天小编给大家分享一下Android怎么自定义ScrollView实现阻尼回弹的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
解决思路:
ScrollView使用时要求内部有且仅一个子View。当ScrollView滑动到边界时,让子View在ScrollView中随着手指按一定的规则进行平移,模拟出拉伸效果。当手指松开时,再让子View恢复拉伸前的位置,模拟出回弹效果。
完整的代码如下,详细的原理见注释即可
public class StretchScrollView extends NestedScrollView { // 子View private View innerView; // 上次手势事件的y坐标 private float mLastY; // 记录子View的正常位置 private Rect normal = new Rect(); public StretchScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { initView(); super.onFinishInflate(); } /** * 获取ScrollView的子布局 */ private void initView() { // 去除原本ScrollView滚动到边界时的阴影效果 setOverScrollMode(OVER_SCROLL_NEVER); if (getChildAt(0) != null) { innerView = getChildAt(0); } } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: // 手指松开恢复 if (!normal.isEmpty()) { planAnimation(); normal.setEmpty(); mLastY = 0; } break; case MotionEvent.ACTION_MOVE: float currentY = ev.getY(); // 滑动距离 int distanceY = (int) (mLastY - currentY); // 处理Y轴的滚动事件,当滚动到最上或者最下时需要移动布局 // 手指刚触及屏幕时,也会触发此事件,此时mLastY的值还是0,会立即触发一个比较大的移动。这里过滤掉这种情况 if (isNeedTranslate() && mLastY != 0) { if (normal.isEmpty()) { // 保存正常的布局位置 normal.set(innerView.getLeft(), innerView.getTop(), innerView.getRight(), innerView.getBottom()); } // 移动布局, 使distance / 2 防止平移过快 innerView.layout(innerView.getLeft(), innerView.getTop() - distanceY / 2, innerView.getRight(), innerView.getBottom() - distanceY / 2); } mLastY = currentY; break; } return super.onTouchEvent(ev); } /** * 回缩动画 */ public void planAnimation() { // 开启移动动画 TranslateAnimation animation = new TranslateAnimation(0, 0, innerView.getTop(), normal.top); animation.setDuration(200); innerView.startAnimation(animation); // 补间动画并不会真正修改innerView的位置,这里需要设置使得innerView回到正常的布局位置 innerView.layout(normal.left, normal.top, normal.right, normal.bottom); } /** * 是否需要Y移动布局 */ public boolean isNeedTranslate() { int offset = innerView.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); // 顶部或者底部 return scrollY == 0 || scrollY == offset; }}以上就是"Android怎么自定义ScrollView实现阻尼回弹"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
布局
位置
移动
手指
知识
篇文章
事件
动画
效果
阻尼
内容
边界
平移
不同
很大
个子
代码
原本
原理
坐标
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳科技互联网
互联网科技金融
青岛互联网科技公司
互联网科技小贷
朗涯互联网科技
宜安科技 互联网金融
大白互联网科技
互联网金融监管科技
银川新华互联网科技学校地址
字节跳动和互联网科技
互联网企业和科技型企业
民营互联网公司国防科技
阿里互联网科技企业
互联网科技如何创业
上海京穆互联网科技有限公司
互联网营销推广黑科技
唯美互联网科技
互联网科技大佬云集
互联网高科技绘画
利用互联网等科技手段
上海挚品互联网科技有限公司
美国互联网保险保险科技
互联网巨头反垄断金融科技
互联网汽车科技小镇
互联网科技创新服务
四川慕妮娅互联网科技有限公司
世界互联网领先科技成果获奖
福州德业互联网科技
现代互联网科技公司
宁波允成互联网科技有限公司