废话不多说,具体代码如下所示:
public class MyScrollView extends ScrollView {
private View childView;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// @Override
// protected void onLayout(boolean changed, int l, int t, int r, int b) {
// super.onLayout(changed, l, t, r, b);
// }
//获取子视图
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (getChildCount() > 0) {
childView = getChildAt(0);
}
}
private int lastY;//上一次y轴方向操作的坐标位置
private Rect normal = new Rect();//用于记录临界状态的左、上、右、下
private boolean isFinishAnimation = true;//是否动画结束
private int lastX, downX, downY;
//拦截:实现父视图对子视图的拦截
//是否拦截成功,取决于方法的返回值。返回值true:拦截成功。反之,拦截失败
@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 >= UIUtils.dp2px(10)){
isIntercept = true;//执行拦截
}
lastX = eventX;
lastY = eventY;
break;
}
return isIntercept;
}
@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);
}
//判断是否需要执行平移动画
private boolean isNeedAnimation() {
return !normal.isEmpty();
}
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;
}
}
以上所述是小编给大家介绍的Android界面上拉下拉的回弹效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# 上拉下拉回弹
# Android ScrollView的顶部下拉和底部上拉回弹效果
# Android RecyclerView上拉加载更多功能回弹实现代码
# android仿QQ个人主页下拉回弹效果
# Android ReboundScrollView仿IOS拖拽回弹效果
# Android仿IOS回弹效果 支持任何控件
# Android ScrollView实现横向和竖向拖动回弹效果
# Android自定义ScrollView实现放大回弹效果
# Android编程ViewPager回弹效果实例分析
# Android自定义控件仿ios下拉回弹效果
# Android基于reclyview实现列表回弹动画效果
# 小编
# 返回值
# 在此
# 给大家
# 自定义
# 所示
# 多说
# 停留在
# 所述
# 给我留言
# 感谢大家
# 判断是否
# 疑问请
# 有任何
# 偏移量
# 水平和
# lastX
# true
# downX
# normal
相关文章:
如何在Windows服务器上快速搭建网站?
如何选择建站程序?包含哪些必备功能与类型?
h5网站制作工具有哪些,h5页面制作工具有哪些?
企业微网站怎么做,公司网站和公众号有什么区别?
,购物网站怎么盈利呢?
专业网站建设制作报价,网页设计制作要考什么证?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过可视化优化提升建站效果?
学校为何禁止电信移动建设网站?
如何自定义建站之星模板颜色并下载新样式?
全景视频制作网站有哪些,全景图怎么做成网页?
网站制作软件有哪些,制图软件有哪些?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
制作销售网站教学视频,销售网站有哪些?
建站之星如何快速更换网站模板?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何在企业微信快速生成手机电脑官网?
高防服务器:AI智能防御DDoS攻击与数据安全保障
制作营销网站公司,淘特是干什么用的?
建站之星北京办公室:智能建站系统与小程序生成方案解析
视频网站制作教程,怎么样制作优酷网的小视频?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
css网站制作参考文献有哪些,易聊怎么注册?
Thinkphp 中 distinct 的用法解析
制作网站的基本流程,设计网站的软件是什么?
建站之星如何取消后台验证码生成?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何快速搭建安全的FTP站点?
如何快速完成中国万网建站详细流程?
建站之星后台密码如何安全设置与找回?
江苏网站制作公司有哪些,江苏书法考级官方网站?
湖北网站制作公司有哪些,湖北清能集团官网?
建站主机选购指南:核心配置优化与品牌推荐方案
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
在线制作视频网站免费,都有哪些好的动漫网站?
小型网站建站如何选择虚拟主机?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星好吗?新手能否轻松上手建站?
如何在阿里云通过域名搭建网站?
建站之星与建站宝盒如何选择最佳方案?
如何在建站宝盒中设置产品搜索功能?
如何解决VPS建站LNMP环境配置常见问题?
*请认真填写需求信息,我们会在24小时内与您取得联系。