背景

在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容。但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加一个回弹的动画效果,会让界面交互更加舒服,提升用户体验效果。
自定义ScrollView
1、创建一个类,继承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);
}
}
2、获取默认第一个子View即我们的头部mHeaderView
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// 设置不可过度滚动,否则上移后下拉会出现部分空白的情况
setOverScrollMode(OVER_SCROLL_NEVER);
View child = getChildAt(0);
if (child != null && child instanceof ViewGroup) {
// 获取默认第一个子View
ViewGroup vg = (ViewGroup) getChildAt(0);
if (vg.getChildAt(0) != null) {
mHeaderView = vg.getChildAt(0);
}
}
}
3、获取头部View的长和宽
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mHeaderWidth = mHeaderView.getMeasuredWidth();
mHeaderHeight = mHeaderView.getMeasuredHeight();
}
4、设置上下滑动标记
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
currentX = ev.getX();
currentY = ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
distanceX = currentX - lastX;
distanceY = currentY - lastY;
if (Math.abs(distanceX) < Math.abs(distanceY) && Math.abs(distanceY) > 12) {
upDownSlide = true;
}
break;
}
lastX = currentX;
lastY = currentY;
if (upDownSlide && mHeaderView != null) {
commOnTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
5、监听触摸事件
private void commOnTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
// 手指离开后头部恢复图片
mIsPulling = false;
replyView();
clear();
break;
case MotionEvent.ACTION_MOVE:
if (!mIsPulling) {
// 第一次下拉
if (getScrollY() == 0) {
// 滚动到顶部时记录位置,否则正常返回
mLastY = (int) ev.getY();
} else {
break;
}
}
int distance = (int) ((ev.getY() - mLastY) * mScaleRatio);
// 当前位置比记录位置要小时正常返回
if (distance < 0) {
break;
}
mIsPulling = true;
setZoom(distance);
break;
}
}
6、头部缩放
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);
}
7、回弹动画
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();
}
通过以上方式就可以简单的实现我们想要的效果了!
项目地址 ☞ 传送门
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# ScrollView
# 放大
# 回弹
# Android ScrollView的顶部下拉和底部上拉回弹效果
# Android RecyclerView上拉加载更多功能回弹实现代码
# android仿QQ个人主页下拉回弹效果
# Android界面上拉下拉的回弹效果实例代码
# Android ReboundScrollView仿IOS拖拽回弹效果
# Android仿IOS回弹效果 支持任何控件
# Android ScrollView实现横向和竖向拖动回弹效果
# Android编程ViewPager回弹效果实例分析
# Android自定义控件仿ios下拉回弹效果
# Android基于reclyview实现列表回弹动画效果
# 会让
# 这个时候
# 自定义
# 重写
# 创建一个
# 给它
# 大家多多
# 就可以
# 长和
# 加载
# 传送门
# oldw
# instanceof
# onSizeChanged
# vg
# ViewGroup
# OVER_SCROLL_NEVER
# setOverScrollMode
# onFinishInflate
# amp
相关文章:
香港服务器网站卡顿?如何解决网络延迟与负载问题?
建站之星各版本价格是多少?
如何在宝塔面板中创建新站点?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何在Tomcat中配置并部署网站项目?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
打鱼网站制作软件,波克捕鱼官方号怎么注册?
英语简历制作免费网站推荐,如何将简历翻译成英文?
外贸公司网站制作哪家好,maersk船公司官网?
建站主机与服务器功能差异如何区分?
,有什么在线背英语单词效率比较高的网站?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何在服务器上三步完成建站并提升流量?
网站网页制作专业公司,怎样制作自己的网页?
太平洋网站制作公司,网络用语太平洋是什么意思?
油猴 教程,油猴搜脚本为什么会网页无法显示?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
北京企业网站设计制作公司,北京铁路集团官方网站?
建站主机类型有哪些?如何正确选型
开心动漫网站制作软件下载,十分开心动画为何停播?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何通过建站之星自助学习解决操作问题?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
建站之星安装后界面空白如何解决?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
TestNG的testng.xml配置文件怎么写
个人网站制作流程图片大全,个人网站如何注销?
建站三合一如何选?哪家性价比更高?
建站DNS解析失败?如何正确配置域名服务器?
如何通过IIS搭建网站并配置访问权限?
网站制作公司排行榜,四大门户网站排名?
高防服务器租用指南:配置选择与快速部署攻略
太原网站制作公司有哪些,网约车营运证查询官网?
如何挑选最适合建站的高性能VPS主机?
建站org新手必看:2024最新搭建流程与模板选择技巧
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
建站主机是什么?如何选择适合的建站主机?
文字头像制作网站推荐软件,醒图能自动配文字吗?
安徽网站建设与外贸建站服务专业定制方案
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何快速搭建FTP站点实现文件共享?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
金*站制作公司有哪些,金华教育集团官网?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
长沙做网站要多少钱,长沙国安网络怎么样?
如何在宝塔面板中修改默认建站目录?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。