android 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果
背景
在很多项目中我们都会用到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 按下缩小效果松开恢复_Android自定义ScrollView实现放大回弹效果相关推荐
- Android -- 自定义ScrollView实现放大回弹效果
1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果 ...
- android 缩放回弹动画,Android自定义ScrollView实现放大回弹效果实例代码
1,刚刚在别人开源的项目中看到了一个挺不错的用户体验,效果图如下: 2,那下面我们就来实现一下,首先看一下布局,由于一般只是我们包含头像的那部分方法,所以这里我们要把布局分成两部分,对应的布局文件效果 ...
- android 按下缩小效果松开恢复_android 按住和松开的事件
释放双眼,带上耳机,听听看~! 按住和松开的事件 分为两种情况: (1)是手机上键盘的按键按住和松开事件:onKey() imageButton.setOnKeyListener(imageKeyLi ...
- android 清空canvas部分内容_Android自定义View实现圆形头像效果
在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...
- 安卓吸顶+下拉放大_Android自定义scrollView实现顶部图片下拉放大
本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下 之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦 ...
- android分段加载_Android自定义ScrollView分段加载大文本数据到TextView
这是我现在碰到的一个问题,如果需要在TextView中加载大文本的时候,比如几M的txt文件时,TextView载入的时候会出现卡死的现象,甚至会出现异常等待退出出现. 解决办法之一就是通过" ...
- android 按下缩小效果松开恢复_iPhone XS/XS Max如何强制重启?如何进入恢复模式或DFU模式?...
当 iPhone 遇到死机或者无法开机或其它意外情况,我们需要尝试重启设备,那么iPhone XS.iPhone XS Max如何重启或进入恢复模式.DFU模式呢?您可以参考此教程. iPhone X ...
- android 按下缩小效果松开恢复_22省份三季报:粤苏总量差距缩小,19省份实现正增长...
澎湃新闻记者 张静 截至10月22日,除河北.辽宁.黑龙江.上海.浙江.河南.广西.新疆.西藏外,全国22省份经济三季报出炉. 从前三季度经济总量上看,广东.江苏继续领跑全国,均站上7万亿元大关.其中 ...
- android刷新时的圆形动画_Android自定义加载圈动画效果
本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...
最新文章
- 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染技术!
- HBase编程 API入门系列之put(客户端而言)(1)
- jQuery 在Table中选择input之类的东西注意事项
- OPA 5 - CreateButtonTest creates CreateButtonSteps
- [译]Go语言常用文件操作汇总
- shiro密码正确也会匹配错误_智能商贸-Shiro
- 网络数据抓包分析工具Debookee 8 for Mac
- 为什么中介哄抢租赁房源,你应该知道的真相?
- scrapy框架—spiders
- 关闭Software Reporter Tool
- [NOIP模拟测试30]题解
- 虚拟机未正常关闭,结果再次启动的时候打不开了?
- 国内各大短视频平台去水印下载内容,新年限时免费使用。
- 评论:雷军再次分享互联网七字诀 称用诺基亚的人out了
- 专升本-计算机公共课考点(3)——字处理软件Word 2010
- 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
- 学计算机南昌哪个中专比较好,南昌中专计算机主要学什么
- Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
- 带你了解SN74LVC245ADWR
- unity 简易枪支射击
热门文章
- js形参(parameter)和实参(argument)
- sql server 自定义函数
- URLEncoder编码
- 【HDU1325】Is It A Tree?(并查集基础题)
- 开机显示c:\windows\windows32\config\system文件损坏或丢失的解决方法(收集)
- golang 没有名字参数_Go 返回参数命名
- eclipse maven项目 class类部署不到tomcat下_Servlet tomcat部署
- XYZ DOWN-电子书
- python爬虫数据可视化_python 爬虫与数据可视化--python基础知识
- 上海大学c语言作业答案,《上海大学C语言选择题》.doc