全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android界面上拉下拉的回弹效果实例代码

废话不多说,具体代码如下所示:

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小时内与您取得联系。