android怎么实现可上下回弹的scrollview
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"android怎么实现可上下回弹的scrollview",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"android怎么实现可上下回弹的s
千家信息网最后更新 2026年11月01日android怎么实现可上下回弹的scrollview
本篇内容主要讲解"android怎么实现可上下回弹的scrollview",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"android怎么实现可上下回弹的scrollview"吧!
1. 新建MyScrollView并继承ScrollView,可以通过事件分发机制拦截并处理滑动事件
2. 重写事件分发拦截事件onInterceptTouchEvent方法,计算是否需要拦截事件
//拦截:实现父视图对子视图的拦截//是否拦截成功,取决于方法的返回值。返回值true:拦截成功。反之,拦截失败private int lastY;//上一次y轴方向操作的坐标位置 private Rect normal = new Rect();//用于记录临界状态的左、上、右、下 private boolean isFinishAnimation = true;//是否动画结束 private int lastX, downX, downY; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean isIntercept = false; int eventX = (int) ev.getX(); int eventY = (int) ev.getY(); switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: lastX = downX = eventX; lastY = downY = eventY; break; case MotionEvent.ACTION_MOVE: //获取水平和垂直方向的移动距离 int absX = Math.abs(eventX - downX); int absY = Math.abs(eventY - downY); if(absY > absX && absY >= dp2px(10)){ isIntercept = true;//执行拦截 } lastX = eventX; lastY = eventY; break; } return isIntercept; }3. 得到scrollview的子view,便于操作
//获取子视图 @Override protected void onFinishInflate() { super.onFinishInflate(); if (getChildCount() > 0) { childView = getChildAt(0); } }4. 计算是否需要平移动画
private boolean isNeedMove() { int childMeasuredHeight = childView.getMeasuredHeight();//获取子视图的高度 int scrollViewMeasuredHeight = this.getMeasuredHeight();//获取布局的高度 Log.e("TAG", "childMeasuredHeight = " + childMeasuredHeight); Log.e("TAG", "scrollViewMeasuredHeight = " + scrollViewMeasuredHeight); int dy = childMeasuredHeight - scrollViewMeasuredHeight;//dy >= 0 int scrollY = this.getScrollY();//获取用户在y轴方向上的偏移量 (上 + 下 -) if (scrollY <= 0 || scrollY >= dy) { return true;//按照我们自定义的MyScrollView的方式处理 } //其他处在临界范围内的,返回false。即表示,仍按照ScrollView的方式处理 return false; }5. 判断是否需要平移动画
//判断是否需要执行平移动画 private boolean isNeedAnimation() { return !normal.isEmpty(); }6. 既然我们做了事件拦截,那么就要重写ontouchevent来执行响应事件
@Override public boolean onTouchEvent(MotionEvent ev) { if (childView == null || !isFinishAnimation) { return super.onTouchEvent(ev); } int eventY = (int) ev.getY();//获取当前的y轴坐标 switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: lastY = eventY; break; case MotionEvent.ACTION_MOVE: int dy = eventY - lastY;//微小的移动量 if (isNeedMove()) { if (normal.isEmpty()) { //记录了childView的临界状态的左、上、右、下 normal.set(childView.getLeft(), childView.getTop(), childView.getRight(), childView.getBottom()); } //重新布局 childView.layout(childView.getLeft(), childView.getTop() + dy / 2, childView.getRight(), childView.getBottom() + dy / 2); } lastY = eventY;//重新赋值 break; case MotionEvent.ACTION_UP: if (isNeedAnimation()) { //使用平移动画 int translateY = childView.getBottom() - normal.bottom; TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, -translateY); translateAnimation.setDuration(200);// translateAnimation.setFillAfter(true);//停留在最终位置上 translateAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { isFinishAnimation = false; } @Override public void onAnimationEnd(Animation animation) { isFinishAnimation = true; childView.clearAnimation();//清除动画 //重新布局 childView.layout(normal.left, normal.top, normal.right, normal.bottom); //清除normal的数据 normal.setEmpty(); } @Override public void onAnimationRepeat(Animation animation) { } }); //启动动画 childView.startAnimation(translateAnimation); } break; } return super.onTouchEvent(ev);}这样整个view的核心部分已经完成了,把view嵌套到定义好了的scrollview就可以实现页面的滑动回弹效果了。
到此,相信大家对"android怎么实现可上下回弹的scrollview"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
事件
动画
视图
平移
上下
布局
方向
方法
处理
成功
位置
内容
坐标
方式
状态
高度
学习
移动
实用
微小
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳恒合互联网络科技有限公司
广州凡科互联网科技
互联网高科技企业
中国互联网金融科技基金
互联网科技公司招聘
以后互联网后是啥科技
汽车互联网创新科技园
栖莱科技互联网股份有限公司
互联网还是高科技吗
保险科技服务互联网营销体系
美国互联网科技实力
科技互联网的核心竞争力
山东大美朱楼互联网科技有限公司
互联网公司属于科技吗
长沙渺峰互联网科技有限公司
福仕德教育科技互联网
互联网科技创新创业项目
网互联网络科技
北京瑞云互联网科技有限公司
小牛互联网科技有限公司地址
蓝思科技飞鸽互联网
世界互联网领先科技成果
小马过河互联网科技
互联网科技公司有风险吗
搜狐科技互联网
青海科技产业互联网发展
科技大学互联网
美国互联网科技实力
黑云互联网科技有限公司
上海互联网科技园景观