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

@Overrideprotected void onFinishInflate() {super.onFinishInflate();//设置不可过度滚动,否则上移后下拉会出现部分空白的情况setOverScrollMode(OVER_SCROLL_NEVER);View child = getChildAt(0);if (child != null && child instanceof ViewGroup) {//获取默认第一个子ViewmHeaderView = ((ViewGroup) child).getChildAt(0);}}

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

@Overridepublic 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() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {setZoom((Float) animation.getAnimatedValue());}});anim.start();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mHeaderWidth = mHeaderView.getMeasuredWidth();mHeaderHeight = mHeaderView.getMeasuredHeight();}

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

  github下载地址(还没有传上去,网速差,骚等一下),有需要源码的同学可以去下载一下。See You Next Time ......

转载于:https://www.cnblogs.com/wjtaigwh/p/6549863.html

Android -- 自定义ScrollView实现放大回弹效果相关推荐

  1. android 缩放回弹动画,Android自定义ScrollView实现放大回弹效果实例代码

    1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果 ...

  2. android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果

    背景 在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容.但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加 ...

  3. android 自定义Scrollview实现淘宝二层楼效果新版微信小程序下拉效果

    android 自定义Scrollview实现淘宝二层楼效果新版微信小程序下拉效果 由于最近一段时间真的是太忙了,没有顾上即使更新博客,还请粉丝们见谅,最近要实现这样一个效果,这个效果跟淘宝二层楼和新 ...

  4. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球

    Android自定义View--实现水波纹效果类似剩余流量球 三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...

  5. android自定义标尺,Android自定义标尺滑动选择值效果

    Android自定义标尺滑动选择值效果 发布时间:2020-10-16 07:40:15 来源:脚本之家 阅读:130 作者:676598624 本文实例为大家分享了Android实现滑动标尺选择值, ...

  6. android 自定义ScrollView实现背景图片伸缩(阻尼效果)

    android 自定义ScrollView实现强调内容背景图片伸缩(仿多米,qq空间背景的刷新) 看到一篇文章,自己更改了一下bug: 原文地址:http://www.aiuxian.com/arti ...

  7. Android 自定义ScrollView ListView 体验各种纵向滑动的需求

    1.概述 群里的一个哥们有个需求是这样的:问题:主要功能就是:1.循环的一个滑动:2.每次滑动结束,保持每个Item的完整.然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太 ...

  8. Android自定义View实现QQ气泡效果

    首先我们来看一下最终的效果: 根据我们上边拆分出来的公式,我们分别看看每一个效果需要如何去实现: 红色圆:canvas.drawCircle 消息数字:canvas.drawText 拖拽粘性效果:c ...

  9. Android 自定义加载Dialog 运行效果流畅

    如何实现Android 自定义加载Dialog,而且运行效果流畅.用ProgreBar效果不是很好. 下面介绍一种用ImageView+动画  实现. 1.在.xml中加入控件: <ImageV ...

最新文章

  1. 基于php下载文件的详解
  2. 实现给一个DIV加阴影效果!
  3. lucene 自定义评分
  4. 自定义View之onMeasure()
  5. C语言 函数缺省参数 - C语言零基础入门教程
  6. 68 SD配置-发票凭证配置-定义出具发票类型
  7. freemarker中运算符_freemarker常见语法大全
  8. 虚拟Python环境可以这样创建
  9. 帝国cms怎么搭建python环境_Python 库/模块的pip安装和IPython的使用
  10. hdu 1285 确定比赛名次
  11. node获取windows pc 机器的标示
  12. 转HashMap Hashtable区别
  13. 一个类windows系统的效果图
  14. 对PID的理解及其实现公式
  15. 狄拉克量子力学原理【1】态叠加原理
  16. Adlik发布v0.1.0(Antelope羚羊)版本,赋能深度学习模型产业化
  17. 这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
  18. html页面显示代码插件,jQuery – 高亮动态显示页面HTML代码插件
  19. 穆穆推荐-软件销售行业软件公司销售参考操作手册--之1--公司软件产品的定位分类以及目标客户定位-待续....
  20. MATLAB学习笔记(五)——MATLAB绘图

热门文章

  1. 设置其他用户文件、文件夹权限与现用户权限相同(命令、权限)
  2. 2019牛客多校四 E. triples II (容斥)
  3. suse12安装详解
  4. 关于使用jquery修改hover伪标签的样式
  5. 自定义JPA之AttributeConverter
  6. [ffmpeg 扩展第三方库编译系列] 关于libopenjpeg mingw32编译问题
  7. 12.24笔记(关于//UIDynamic演练//多对象的附加行为//UIDynamic简单演练//UIDynamic//(CoreText框架)NSAttributedString)...
  8. 非递归分治法排序 MergeSort without recursion
  9. URL生成方式性能优化结果
  10. AlphaGo背后这项核心技术,后来怎么样了?