转载记录备份查阅

import android.annotation.SuppressLint;
import android.os.Build;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.HorizontalScrollView;
import android.widget.ScrollView;/*** Created by Sugar on 2017/12/7/0007.*/public class UITools {/**HorizontalScrollView添加阻尼效果* ScrollView效果不太好* 利用父元素的Padding给ScrollView添加弹性* @param scrollView* @param padding*/public static void elasticPadding(final ScrollView scrollView, final int padding){View child = scrollView.getChildAt(0);//记录以前的paddingfinal int oldpt = child.getPaddingTop();final int oldpb = child.getPaddingBottom();//设置新的paddingchild.setPadding(child.getPaddingLeft(), padding+oldpt, child.getPaddingRight(), padding+oldpb);//添加视图布局完成事件监听scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {private boolean inTouch = false; //手指是否按下状态@SuppressLint("NewApi")private void disableOverScroll(){scrollView.setOverScrollMode(ScrollView.OVER_SCROLL_NEVER);}/**  滚动到顶部 */private void scrollToTop(){scrollView.smoothScrollTo(scrollView.getScrollX(), padding-oldpt);}/** 滚动到底部 */private void scrollToBottom(){scrollView.smoothScrollTo(scrollView.getScrollX(), scrollView.getChildAt(0).getBottom()-scrollView.getMeasuredHeight()-padding+oldpb);}/** 检测scrollView结束以后,复原位置 */private final Runnable checkStopped = new Runnable() {@Overridepublic void run() {int y = scrollView.getScrollY();int bottom = scrollView.getChildAt(0).getBottom()-y-scrollView.getMeasuredHeight();if(y <= padding && !inTouch){scrollToTop();}else if(bottom<=padding && !inTouch){scrollToBottom();}}};@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {//移除监听器scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this);//设置最小高度//scrollView.getChildAt(0).setMinimumHeight(scrollView.getMeasuredHeight());//取消overScroll效果if(Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD){disableOverScroll();}scrollView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_POINTER_DOWN){inTouch = true;}else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){inTouch = false;//手指弹起以后检测一次是否需要复原位置scrollView.post(checkStopped);}return false;}});scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {@Overridepublic void onScrollChanged() {if(!inTouch && scrollView!=null && scrollView.getHandler()!=null){//如果持续滚动,移除checkStopped,停止滚动以后只执行一次检测任务scrollView.getHandler().removeCallbacks(checkStopped);scrollView.postDelayed(checkStopped, 100);}}});//第一次加载视图,复原位置scrollView.postDelayed(checkStopped, 300);}});}/*** 利用父元素的Padding给HorizontalScrollView添加弹性* @param scrollView* @param padding*/public static void elasticPadding(final HorizontalScrollView scrollView, final int padding){Log.i("", "elasticPadding>>>>!!");View child = scrollView.getChildAt(0);//记录以前的paddingfinal int oldpt = child.getPaddingTop();final int oldpb = child.getPaddingBottom();//设置新的paddingchild.setPadding(padding+oldpt, child.getPaddingTop(), padding+oldpb, child.getPaddingBottom());//添加视图布局完成事件监听scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {private boolean inTouch = false; //手指是否按下状态@SuppressLint("NewApi")private void disableOverScroll(){scrollView.setOverScrollMode(ScrollView.OVER_SCROLL_NEVER);}/**  滚动到左边 */private void scrollToLeft(){scrollView.smoothScrollTo(padding-oldpt, scrollView.getScrollY());}/** 滚动到底部 */private void scrollToRight(){scrollView.smoothScrollTo(scrollView.getChildAt(0).getRight()-scrollView.getMeasuredWidth()-padding+oldpb, scrollView.getScrollY());}/** 检测scrollView结束以后,复原位置 */private final Runnable checkStopped = new Runnable() {@Overridepublic void run() {int x = scrollView.getScrollX();int bottom = scrollView.getChildAt(0).getRight()-x-scrollView.getMeasuredWidth();if(x <= padding && !inTouch){scrollToLeft();}else if(bottom<=padding && !inTouch){scrollToRight();}}};@SuppressWarnings("deprecation")@Overridepublic void onGlobalLayout() {//移除监听器scrollView.getViewTreeObserver().removeGlobalOnLayoutListener(this);//取消overScroll效果if(Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD){disableOverScroll();}scrollView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_POINTER_DOWN){inTouch = true;}else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){inTouch = false;//手指弹起以后检测一次是否需要复原位置scrollView.post(checkStopped);}return false;}});scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {@Overridepublic void onScrollChanged() {//如果持续滚动,移除checkStopped,停止滚动以后只执行一次检测任务if(!inTouch && scrollView!=null && scrollView.getHandler()!=null){scrollView.getHandler().removeCallbacks(checkStopped);scrollView.postDelayed(checkStopped, 100);}}});//第一次加载视图,复原位置scrollView.postDelayed(checkStopped, 300);}});}
}

调用方式:

UITools.elasticPadding((HorizontalScrollView) findViewById(R.id.hs), 500);

Android HorizontalScrollView回弹效果相关推荐

  1. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  2. android 列表回弹效果,Android ListView ScrollView回弹效果

    ios中对可以滚动的视图都在系统层面上实现了触碰到边缘的阻尼回弹效果,用户一看便知自己的操作已经到了边界.android中也有类似的方案,不过当到达边界的时候不是用阻尼的方式,而是逐渐显示一个渐变颜色 ...

  3. android 布局回弹,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  4. android horizontalscrollview 动画,Android HorizontalScrollView左右滑动效果

    本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下 效果图 一.什么是HorizontalScrollView Horizonta ...

  5. Android webView 实现阻尼回弹效果

    iOS webView默认滑动到顶部或者底部的时候,还可以继续通过手指拉扯滑动,松手后回弹:而Android webView默认是不行的,要实现跟iOS一样的效果,就需要自定义webView. ios ...

  6. Android仿Ios下拉回弹,Android ReboundScrollView仿IOS拖拽回弹效果

    初衷: 其实github上有很多这种ScrollView的项目,但是不得不说功能太多太乱了,我就只是想要一个简单效果的ScrollView,另外监听下滑动距离而已,想想还是自己写了个. 这里先说下思路 ...

  7. android组件的下拉回弹,Android自定义控件仿ios下拉回弹效果

    网上有很多类似的文章,大多数还是继承listview来实现(主要是listview.addHeaderView()和listview.addFooterView在listview的首尾添加view,也 ...

  8. Android实现背景图下拉回弹效果

    Android实现背景图下拉回弹效果 增加设置不横向拉伸时增加回弹效果 增加切换横屏时可滑动效果 效果 实现 public class HeadZoomScrollView extends Neste ...

  9. Android回弹效果新思考与更加易用的实现

    前言 最近app需要在首页上做一个类似iOS的回弹效果, 我们的首页是一个ExpandableListView, 如果要做到类似iOS的回弹效果, 最先想到的思路就是使用额外添加的Header和Foo ...

最新文章

  1. 55 前端构建工具Gulp
  2. 使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
  3. struts2获取服务器临时目录
  4. C# webrequest 抓取数据时,多个域Cookie的问题
  5. getter/setter_Getters / Setters。 邪恶。 期。
  6. 小故事分享:千里马与苍蝇的故事
  7. 惊呆了!速度高达15000fps的人脸检测算法!
  8. struts2框架之文件下载(参考第三天学习笔记)
  9. c语言基础教程吕答案,全国计算机等级考试二级教程C语言程序设计课后习题答案.docx...
  10. 【英语学习】【Daily English】U05 Places L02 Any apartment available?
  11. 信创产业已成现象级新风口 代码“源头”安全该如何守护?
  12. 《python源代码分析》笔记 pythonVM一般表达式
  13. 如何调节idea jvm的最大内存_那个小白还没搞懂内存溢出,只能用案例说给他听了
  14. smale学习之数学表达式(day2)
  15. java在线编译器手机版_java编译器app_java编译器手机版_java编程-多特软件站安卓网...
  16. 如何使用多种方法在 Mac 上截屏?
  17. SSH密匙key介绍
  18. FPGA基础入门【10】开发板Ethernet PHY局域网配置
  19. 笔记本超频会烧吗_笔记本cpu可以超频吗。有什么危害。怎么超频
  20. matlab2020a安装完多大_Matlab2020a

热门文章

  1. 数字普惠金融与技术创新—基于企业生命周期视角
  2. python bs4库_python bs4库
  3. 身边的人脸安全:员工用人脸作弊工具打卡,企业该如何防范?
  4. 《Effective c++》学习笔记
  5. 霍金走了,宇宙少了一个预言家
  6. to B 产品是不是不好做啊
  7. Siemens Simcenter FloEFD 2021.1.0 v5312 for Catia V5
  8. 15、交叉编译pango
  9. js类似matlab_后MATLAB时代的七种开源替代,一种替代堪称完美!
  10. 淘宝秒杀脚本(python学习笔记)