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