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
@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实现放大回弹效果相关推荐
- android 缩放回弹动画,Android自定义ScrollView实现放大回弹效果实例代码
1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果 ...
- android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果
背景 在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容.但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加 ...
- android 自定义Scrollview实现淘宝二层楼效果新版微信小程序下拉效果
android 自定义Scrollview实现淘宝二层楼效果新版微信小程序下拉效果 由于最近一段时间真的是太忙了,没有顾上即使更新博客,还请粉丝们见谅,最近要实现这样一个效果,这个效果跟淘宝二层楼和新 ...
- android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
Android自定义View--实现水波纹效果类似剩余流量球 三个点 pre ber block span 初始化 move 理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...
- android自定义标尺,Android自定义标尺滑动选择值效果
Android自定义标尺滑动选择值效果 发布时间:2020-10-16 07:40:15 来源:脚本之家 阅读:130 作者:676598624 本文实例为大家分享了Android实现滑动标尺选择值, ...
- android 自定义ScrollView实现背景图片伸缩(阻尼效果)
android 自定义ScrollView实现强调内容背景图片伸缩(仿多米,qq空间背景的刷新) 看到一篇文章,自己更改了一下bug: 原文地址:http://www.aiuxian.com/arti ...
- Android 自定义ScrollView ListView 体验各种纵向滑动的需求
1.概述 群里的一个哥们有个需求是这样的:问题:主要功能就是:1.循环的一个滑动:2.每次滑动结束,保持每个Item的完整.然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太 ...
- Android自定义View实现QQ气泡效果
首先我们来看一下最终的效果: 根据我们上边拆分出来的公式,我们分别看看每一个效果需要如何去实现: 红色圆:canvas.drawCircle 消息数字:canvas.drawText 拖拽粘性效果:c ...
- Android 自定义加载Dialog 运行效果流畅
如何实现Android 自定义加载Dialog,而且运行效果流畅.用ProgreBar效果不是很好. 下面介绍一种用ImageView+动画 实现. 1.在.xml中加入控件: <ImageV ...
最新文章
- 基于php下载文件的详解
- 实现给一个DIV加阴影效果!
- lucene 自定义评分
- 自定义View之onMeasure()
- C语言 函数缺省参数 - C语言零基础入门教程
- 68 SD配置-发票凭证配置-定义出具发票类型
- freemarker中运算符_freemarker常见语法大全
- 虚拟Python环境可以这样创建
- 帝国cms怎么搭建python环境_Python 库/模块的pip安装和IPython的使用
- hdu 1285 确定比赛名次
- node获取windows pc 机器的标示
- 转HashMap Hashtable区别
- 一个类windows系统的效果图
- 对PID的理解及其实现公式
- 狄拉克量子力学原理【1】态叠加原理
- Adlik发布v0.1.0(Antelope羚羊)版本,赋能深度学习模型产业化
- 这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
- html页面显示代码插件,jQuery – 高亮动态显示页面HTML代码插件
- 穆穆推荐-软件销售行业软件公司销售参考操作手册--之1--公司软件产品的定位分类以及目标客户定位-待续....
- MATLAB学习笔记(五)——MATLAB绘图
热门文章
- 设置其他用户文件、文件夹权限与现用户权限相同(命令、权限)
- 2019牛客多校四 E. triples II (容斥)
- suse12安装详解
- 关于使用jquery修改hover伪标签的样式
- 自定义JPA之AttributeConverter
- [ffmpeg 扩展第三方库编译系列] 关于libopenjpeg mingw32编译问题
- 12.24笔记(关于//UIDynamic演练//多对象的附加行为//UIDynamic简单演练//UIDynamic//(CoreText框架)NSAttributedString)...
- 非递归分治法排序 MergeSort without recursion
- URL生成方式性能优化结果
- AlphaGo背后这项核心技术,后来怎么样了?