Android怎么自定义ScrollView实现阻尼回弹
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,今天小编给大家分享一下Android怎么自定义ScrollView实现阻尼回弹的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2025年11月08日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安全错误
数据库的锁怎样保障安全
网络技术信源信宿是真的吗
南宁市互联网科技公司
qq邮箱 服务器主机名
网络安全密码怎么解
端游绝地求生服务器繁忙什么意思
广东开放大学计算机网络技术
中山跑腿app软件开发费用
360网络安全学院李洋
主机当服务器
db2数据库集群配置
德国服务器
医院的网络服务器选型
网络安全困扰事件
滴滴快保互联网科技公司
社区开展网络安全倡议
数据库无法访问
手机方舟服务器哪个好玩
美国网络安全体系架构简介
山西金融互联网络科技有限公司
东营苹果软件开发哪家便宜
关于网络安全的资法规
中山跑腿app软件开发费用
游戏服务器地图
游戏软件开发流程ppt讲解
应用服务器上安装docker
嵌入式服务器内存超频
山东大学现代软件开发
上海交通大学数据库系统研究
社区开展网络安全倡议
阿阳解说我的世界西瓜星球服务器