背景

在很多项目中我们都会用到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实现放大回弹效果相关推荐

  1. Android -- 自定义ScrollView实现放大回弹效果

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

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

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

  3. android 按下缩小效果松开恢复_android 按住和松开的事件

    释放双眼,带上耳机,听听看~! 按住和松开的事件 分为两种情况: (1)是手机上键盘的按键按住和松开事件:onKey() imageButton.setOnKeyListener(imageKeyLi ...

  4. android 清空canvas部分内容_Android自定义View实现圆形头像效果

    在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...

  5. 安卓吸顶+下拉放大_Android自定义scrollView实现顶部图片下拉放大

    本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下 之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦 ...

  6. android分段加载_Android自定义ScrollView分段加载大文本数据到TextView

    这是我现在碰到的一个问题,如果需要在TextView中加载大文本的时候,比如几M的txt文件时,TextView载入的时候会出现卡死的现象,甚至会出现异常等待退出出现. 解决办法之一就是通过" ...

  7. android 按下缩小效果松开恢复_iPhone XS/XS Max如何强制重启?如何进入恢复模式或DFU模式?...

    当 iPhone 遇到死机或者无法开机或其它意外情况,我们需要尝试重启设备,那么iPhone XS.iPhone XS Max如何重启或进入恢复模式.DFU模式呢?您可以参考此教程. iPhone X ...

  8. android 按下缩小效果松开恢复_22省份三季报:粤苏总量差距缩小,19省份实现正增长...

    澎湃新闻记者 张静 截至10月22日,除河北.辽宁.黑龙江.上海.浙江.河南.广西.新疆.西藏外,全国22省份经济三季报出炉. 从前三季度经济总量上看,广东.江苏继续领跑全国,均站上7万亿元大关.其中 ...

  9. android刷新时的圆形动画_Android自定义加载圈动画效果

    本文实例为大家分享了Android自定义加载圈动画展示的具体代码,供大家参考,具体内容如下 实现如下效果: 该效果图主要有3个动画: 1.旋转动画 2.聚合动画 3.扩散动画 以上3个动画都是通过Va ...

最新文章

  1. 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染技术!
  2. HBase编程 API入门系列之put(客户端而言)(1)
  3. jQuery 在Table中选择input之类的东西注意事项
  4. OPA 5 - CreateButtonTest creates CreateButtonSteps
  5. [译]Go语言常用文件操作汇总
  6. shiro密码正确也会匹配错误_智能商贸-Shiro
  7. 网络数据抓包分析工具Debookee 8 for Mac
  8. 为什么中介哄抢租赁房源,你应该知道的真相?
  9. scrapy框架—spiders
  10. 关闭Software Reporter Tool
  11. [NOIP模拟测试30]题解
  12. 虚拟机未正常关闭,结果再次启动的时候打不开了?
  13. 国内各大短视频平台去水印下载内容,新年限时免费使用。
  14. 评论:雷军再次分享互联网七字诀 称用诺基亚的人out了
  15. 专升本-计算机公共课考点(3)——字处理软件Word 2010
  16. 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
  17. 学计算机南昌哪个中专比较好,南昌中专计算机主要学什么
  18. Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
  19. 带你了解SN74LVC245ADWR
  20. unity 简易枪支射击

热门文章

  1. js形参(parameter)和实参(argument)
  2. sql server 自定义函数
  3. URLEncoder编码
  4. 【HDU1325】Is It A Tree?(并查集基础题)
  5. 开机显示c:\windows\windows32\config\system文件损坏或丢失的解决方法(收集)
  6. golang 没有名字参数_Go 返回参数命名
  7. eclipse maven项目 class类部署不到tomcat下_Servlet tomcat部署
  8. XYZ DOWN-电子书
  9. python爬虫数据可视化_python 爬虫与数据可视化--python基础知识
  10. 上海大学c语言作业答案,《上海大学C语言选择题》.doc