Android怎么自定义ScrollView实现阻尼回弹
发表于:2025-02-20 作者:千家信息网编辑
千家信息网最后更新 2025年02月20日,今天小编给大家分享一下Android怎么自定义ScrollView实现阻尼回弹的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文
千家信息网最后更新 2025年02月20日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安全错误
数据库的锁怎样保障安全
smtp发信服务器
用友t3服务器名称
票务管理服务器的功能
网络安全 个目标
山西懒人智慧网络技术
数据库中国村落表带经纬度
软件开发工程师分析
前端软件开发工程师招聘
网络安全目标 可靠性
山西it软件开发服务至上
腾嘉琪互联网科技有限公司
局域网通过服务器怎么设置网络
软件开发工具ps
关于数据库access
dms数据库开源
2019年航运业网络安全事件
数据库安全性和完整系统
免费linux云服务器
网络安全防诈骗海报
新余云服务器要多少费用
体育局网络安全管理制度
网关地址和服务器地址是一个吗
三级网络技术通过标准
数据库关联查询命令
cohrance数据库
erp管理需要自己的服务器
女生做软件开发好还是算法好
服务器加多显卡
我的世界如何搬运服务器
数据库的二维表什么意思