Android 实现ViewPager边界回弹效果实例代码

发布时间 - 2026-01-11 01:03:35    点击率:

废话不多说了,直接给大家贴代码了,具体代码如下所示:

public class BounceBackViewPager extends ViewPager {
 private int currentPosition = 0;
 private Rect mRect = new Rect();//用来记录初始位置
 private boolean handleDefault = true;
 private float preX = 0f;
 private static final float RATIO = 0.5f;//摩擦系数
 private static final float SCROLL_WIDTH = 10f;
 public BounceBackViewPager(Context context) {
  super(context);
 }
 public BounceBackViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
 }
 @Override
 public boolean dispatchKeyEvent(KeyEvent event) {
  return super.dispatchKeyEvent(event);
 }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_DOWN) {
   preX = ev.getX();//记录起点
   currentPosition = getCurrentItem();
  }
  return super.onInterceptTouchEvent(ev);
 }
 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  switch (ev.getAction()) {
   case MotionEvent.ACTION_UP:
    onTouchActionUp();
    break;
   case MotionEvent.ACTION_MOVE:
    if (getAdapter().getCount() == 1) {
     float nowX = ev.getX();
     float offset = nowX - preX;
     preX = nowX;
     if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值
      whetherConditionIsRight(offset);
     } else if (offset < -SCROLL_WIDTH) {
      whetherConditionIsRight(offset);
     } else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况
      if (getLeft() + (int) (offset * RATIO) != mRect.left) {
       layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
      }
     }
    } else if ((currentPosition == 0 || currentPosition == getAdapter().getCount() - 1)) {
     float nowX = ev.getX();
     float offset = nowX - preX;
     preX = nowX;
     if (currentPosition == 0) {
      if (offset > SCROLL_WIDTH) {//手指滑动的距离大于设定值
       whetherConditionIsRight(offset);
      } else if (!handleDefault) {//这种情况是已经出现缓冲区域了,手指慢慢恢复的情况
       if (getLeft() + (int) (offset * RATIO) >= mRect.left) {
        layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
       }
      }
     } else {
      if (offset < -SCROLL_WIDTH) {
       whetherConditionIsRight(offset);
      } else if (!handleDefault) {
       if (getRight() + (int) (offset * RATIO) <= mRect.right) {
        layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
       }
      }
     }
    } else {
     handleDefault = true;
    }
    if (!handleDefault) {
     return true;
    }
    break;
   default:
    break;
  }
  return super.onTouchEvent(ev);
 }
 private void whetherConditionIsRight(float offset) {
  if (mRect.isEmpty()) {
   mRect.set(getLeft(), getTop(), getRight(), getBottom());
  }
  handleDefault = false;
  layout(getLeft() + (int) (offset * RATIO), getTop(), getRight() + (int) (offset * RATIO), getBottom());
 }
 private void onTouchActionUp() {
  if (!mRect.isEmpty()) {
   recoveryPosition();
  }
 }
 private void recoveryPosition() {
  TranslateAnimation ta = new TranslateAnimation(getLeft(), mRect.left, 0, 0);
  ta.setDuration(300);
  startAnimation(ta);
  layout(mRect.left, mRect.top, mRect.right, mRect.bottom);
  mRect.setEmpty();
  handleDefault = true;
 }
}

以上所述是小编给大家介绍的Android 实现ViewPager边界回弹效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# viewpager回弹  # android  # viewpager  # Android仿IOS回弹效果 支持任何控件  # Android ScrollView实现横向和竖向拖动回弹效果  # Android ScrollView的顶部下拉和底部上拉回弹效果  # Android自定义ScrollView实现放大回弹效果  # Android自定义ScrollView实现放大回弹效果实例代码  # Android界面上拉下拉的回弹效果实例代码  # android仿QQ个人主页下拉回弹效果  # Android RecyclerView上拉加载更多功能回弹实现代码  # Android ReboundScrollView仿IOS拖拽回弹效果  # Android编程ViewPager回弹效果实例分析  # Android自定义控件仿ios下拉回弹效果  # 给大家  # 这种情况  # 小编  # 在此  # 说了  # 不多  # 所示  # 所述  # 给我留言  # 感谢大家  # 疑问请  # 有任何  # SCROLL_WIDTH  # Context  # RATIO  # preX  # float  # final  # static  # KeyEvent 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: android nfc常用标签读取总结  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何在宝塔面板中修改默认建站目录?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  微信小程序 五星评分(包括半颗星评分)实例代码  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何实现API版本控制_Laravel版本化API设计方案  zabbix利用python脚本发送报警邮件的方法  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Firefox Developer Edition开发者版本入口  如何确认建站备案号应放置的具体位置?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何快速搭建虚拟主机网站?新手必看指南  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  java获取注册ip实例  BootStrap整体框架之基础布局组件  如何快速选择适合个人网站的云服务器配置?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Linux系统运维自动化项目教程_Ansible批量管理实战  微信小程序 canvas开发实例及注意事项  如何用PHP工具快速搭建高效网站?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何基于云服务器快速搭建个人网站?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Android使用GridView实现日历的简单功能  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  详解jQuery中基本的动画方法  如何在景安云服务器上绑定域名并配置虚拟主机?  iOS UIView常见属性方法小结  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  如何构建满足综合性能需求的优质建站方案?  如何在VPS电脑上快速搭建网站?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】