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公式生成方法【指南】

