全网整合营销服务商

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

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

Android自定义ScrollView实现放大回弹效果实例代码

1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下:

2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果图如下:

3,自定义ScrollView

第一步:创建一个类,继承自ScrollView,重写相应的构造函数

public class ZoomInScrollView extends ScrollView {

 public ZoomInScrollView(Context context) {

    this(context, null);

  } 

  public ZoomInScrollView(Context context, AttributeSet attrs) {

    this(context, attrs, 0);

  }

  public ZoomInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {

    super(context, attrs, defStyleAttr);

  }

} 

第二步:重写OnFinishInflate()方法,并记录第一个子view,即我们的head_fragment

@Override

  protected void onFinishInflate() {

    super.onFinishInflate();

    //设置不可过度滚动,否则上移后下拉会出现部分空白的情况

    setOverScrollMode(OVER_SCROLL_NEVER);

    View child = getChildAt(0);

    if (child != null && child instanceof ViewGroup) {

      //获取默认第一个子View

      mHeaderView = ((ViewGroup) child).getChildAt(0);

    }

  } 

第三步:重写OnTouchEvent()方法,在Action_Move方法中拿到下滑的距离,通过设置head_view的属性参数来改变它的大小,在UP的时候还原head_view

@Override

  public boolean onTouchEvent(MotionEvent ev) {

    if (mHeaderView == null)

      return super.onTouchEvent(ev);

    switch (ev.getAction()) {

      case MotionEvent.ACTION_MOVE:

        if (!mIsPulling) {

          //第一次下拉

          if (getScrollY() == 0) {

            //在顶部的时候,记录顶部位置

            mLastY = (int) ev.getY();

          } else {

            break;

          }

        }

        if (ev.getY() - mLastY < 0)

          return super.onTouchEvent(ev);

        int distance = (int) ((ev.getY() - mLastY) * mScaleRatio);

        mIsPulling = true;

        setZoom(distance);

        return true;

      case MotionEvent.ACTION_UP:

        mIsPulling = false;

        replyView();

        break;

    }

    return super.onTouchEvent(ev);

  } 

在回弹view的时候通过属性动画动态的改变head_view的值,并重写onSizeChange()方法,实时的记录head_view的宽高

/**

 ** 放大view

 */

  private void setZoom(float s) {

    float scaleTimes = (float) ((mHeaderWidth + s) / (mHeaderWidth * 1.0));

//    如超过最大放大倍数,直接返回

    if (scaleTimes > mScaleTimes) return;

 

    ViewGroup.LayoutParams layoutParams = mHeaderView.getLayoutParams();

    layoutParams.width = (int) (mHeaderWidth + s);

    layoutParams.height = (int) (mHeaderHeight * ((mHeaderWidth + s) / mHeaderWidth));

//    设置控件水平居中

    ((MarginLayoutParams) layoutParams).setMargins(-(layoutParams.width - mHeaderWidth) / 2, 0, 0, 0);

    mHeaderView.setLayoutParams(layoutParams);

  }

 

  /**

   * 回弹

   */

  private void replyView() {

    final float distance = mHeaderView.getMeasuredWidth() - mHeaderWidth;

    // 设置动画

    ValueAnimator anim = ObjectAnimator.ofFloat(distance, 0.0F).setDuration((long) (distance * mReplyRatio));

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

      @Override

      public void onAnimationUpdate(ValueAnimator animation) {

        setZoom((Float) animation.getAnimatedValue());

      }

    });

    anim.start();

  }

 

@Override

  protected void onSizeChanged(int w, int h, int oldw, int oldh) {

    super.onSizeChanged(w, h, oldw, oldh);

    mHeaderWidth = mHeaderView.getMeasuredWidth();

    mHeaderHeight = mHeaderView.getMeasuredHeight();

  } 

这样就实现了我们的效果了,看一下我们自己实现的效果:

demo下载:ZoomInScrollView_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# scrollview回弹效果  # scrollview回弹  # scrollview下拉回弹  # android ScrollView实现水平滑动回弹  # android实现可上下回弹的scrollview  # Android实现回弹ScrollView的原理  # Android自定义ScrollView实现阻尼回弹  # Android自定义scrollview实现回弹效果  # Android ScrollView实现横向和竖向拖动回弹效果  # Android ScrollView的顶部下拉和底部上拉回弹效果  # Android自定义ScrollView实现放大回弹效果  # Android ReboundScrollView仿IOS拖拽回弹效果  # Android ScrollView实现滚动超过边界松手回弹  # 重写  # 看一下  # 要把  # 自定义  # 就来  # 第二步  # 两部分  # 创建一个  # 第三步  # 开源  # 大家多多  # 实现了  # OVER_SCROLL_NEVER  # setOverScrollMode  # View  # amp  # getChildAt  # child  # Override  # head_fragment 


相关文章: 如何安全更换建站之星模板并保留数据?  完全自定义免费建站平台:主题模板在线生成一站式服务  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何撰写建站申请书?关键要点有哪些?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在IIS管理器中快速创建并配置网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  C++时间戳转换成日期时间的步骤和示例代码  免费视频制作网站,更新又快又好的免费电影网站?  C#怎么使用委托和事件 C# delegate与event编程方法  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何在橙子建站上传落地页?操作指南详解  建站之星北京办公室:智能建站系统与小程序生成方案解析  C#怎么创建控制台应用 C# Console App项目创建方法  如何选择适配移动端的WAP自助建站平台?  建站之星如何实现网站加密操作?  如何挑选最适合建站的高性能VPS主机?  如何通过多用户协作模板快速搭建高效企业网站?  建站之星CMS五站合一模板配置与SEO优化指南  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  Python路径拼接规范_跨平台处理说明【指导】  大型企业网站制作流程,做网站需要注册公司吗?  红河网站制作公司,红河事业单位身份证如何上传?  宝塔建站助手安装配置与建站模板使用全流程解析  公司网站的制作公司,企业网站制作基本流程有哪些?  济南网站制作的价格,历城一职专官方网站?  如何在万网自助建站平台快速创建网站?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  制作证书网站有哪些,全国城建培训中心证书查询官网?  海南网站制作公司有哪些,海口网是哪家的?  建站之星代理如何优化在线客服效率?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  建站之星如何优化SEO以实现高效排名?  如何快速重置建站主机并恢复默认配置?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  清除minerd进程的简单方法  音乐网站服务器如何优化API响应速度?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  制作宣传网站的软件,小红书可以宣传网站吗?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站DNS解析失败?如何正确配置域名服务器?  如何在阿里云香港服务器快速搭建网站?  建站主机系统SEO优化与智能配置核心关键词操作指南  浅谈Javascript中的Label语句  Python如何创建带属性的XML节点  建站之星如何防范黑客攻击与数据泄露? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。