Android ScrollView实现反弹效果的实例
发布时间 - 2026-01-11 02:27:54 点击率:次Android ScrollView实现反弹效果

自定义ScrollView控件:
/**
* ScrollView反弹效果的实现
*/
public class BounceScrollView extends ScrollView {
private View inner;// 孩子View
private float y;// 点击时y坐标
private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)
private boolean isCount = false;// 是否开始计算
public BounceScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/***
* 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
* 方法,也应该调用父类的方法,使该方法得以执行.
*/
@Override
protected void onFinishInflate() {
if (getChildCount() > 0) {
inner = getChildAt(0);
}
}
/***
* 监听touch
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (inner != null) {
commOnTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
/***
* 触摸事件
*
* @param ev
*/
public void commOnTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
// 手指松开.
if (isNeedAnimation()) {
animation();
isCount = false;
}
break;
/***
* 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到,
* 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始.
* 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行.
*/
case MotionEvent.ACTION_MOVE:
final float preY = y;// 按下时的y坐标
float nowY = ev.getY();// 时时y坐标
int deltaY = (int) (preY - nowY);// 滑动距离
if (!isCount) {
deltaY = 0; // 在这里要归0.
}
y = nowY;
// 当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove()) {
// 初始化头部矩形
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(),
inner.getRight(), inner.getBottom());
}
Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop()
+ "," + inner.getRight() + "," + inner.getBottom());
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
inner.getRight(), inner.getBottom() - deltaY / 2);
}
isCount = true;
break;
default:
break;
}
}
/***
* 回缩动画
*/
public void animation() {
// 开启移动动画
TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
normal.top);
ta.setDuration(200);
inner.startAnimation(ta);
// 设置回到正常的布局位置
inner.layout(normal.left, normal.top, normal.right, normal.bottom);
Log.e("jj", "回归:" + normal.left + "," + normal.top + "," + normal.right
+ "," + normal.bottom);
normal.setEmpty();
}
// 是否需要开启动画
public boolean isNeedAnimation() {
return !normal.isEmpty();
}
/***
* 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度
*
* getHeight():获取的是屏幕的高度
*
* @return
*/
public boolean isNeedMove() {
int offset = inner.getMeasuredHeight() - getHeight();
int scrollY = getScrollY();
Log.e("jj", "scrolly=" + scrollY);
// 0是顶部,后面那个是底部
if (scrollY == 0 || scrollY == offset) {
return true;
}
return false;
}
}
实现反弹效果:
<com.techrare.view.BounceScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/tab_chart_bg"
android:scrollbars="none" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp" >
<span style="white-space:pre"> </span><!-- 这里可以尽情的布局 -->
</LinearLayout>
</com.techrare.view.BounceScrollView>
以上就是 Android ScrollView实现反弹效果的实例的讲解,本站关于Android开发的文章还有很多,欢迎大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# ScrollView实现反弹效果
# ScrollView
# Android ScrollView无法填充满屏幕的解决办法
# android scrollview 自动滚动到顶部或者底部的实例
# Android自定义ScrollView实现放大回弹效果
# Android中ScrollView嵌套GridView显示不全解决方法
# android scrollview 滑动到顶端或者指定位置的实现方法
# Android ScrollView取消惯性滚动的方法
# Android中使用ScrollView指定view的顶部悬停效果
# Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法
# 的是
# 是个
# 在这里
# 子类
# 也要
# 希望能
# 自定义
# 欢迎大家
# 时就
# 按下
# 谢谢大家
# 会再
# 还有很多
# 使该
# 判断是否
# 回缩
# onTouchEvent
# touch
# MotionEvent
# ev
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
JS中对数组元素进行增删改移的方法总结
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel如何创建自定义Facades?(详细步骤)
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Laravel用户密码怎么加密_Laravel Hash门面使用教程
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel如何配置和使用缓存?(Redis代码示例)
Android实现代码画虚线边框背景效果
JavaScript如何实现倒计时_时间函数如何精确控制
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
智能起名网站制作软件有哪些,制作logo的软件?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
如何在云主机快速搭建网站站点?
Laravel如何实现本地化和多语言支持?(i18n教程)
香港服务器WordPress建站指南:SEO优化与高效部署策略
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
如何在阿里云虚拟服务器快速搭建网站?
详解jQuery中基本的动画方法
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
做企业网站制作流程,企业网站制作基本流程有哪些?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
详解Huffman编码算法之Java实现
如何在IIS7上新建站点并设置安全权限?
利用JavaScript实现拖拽改变元素大小
如何在宝塔面板中创建新站点?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何快速生成凡客建站的专业级图册?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Python制作简易注册登录系统
如何快速搭建个人网站并优化SEO?
香港服务器部署网站为何提示未备案?
网站建设保证美观性,需要考虑的几点问题!
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
如何用虚拟主机快速搭建网站?详细步骤解析
iOS验证手机号的正则表达式
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】
javascript中的try catch异常捕获机制用法分析
Laravel如何配置Horizon来管理队列?(安装和使用)
html如何与html链接_实现多个HTML页面互相链接【互相】
如何利用DOS批处理实现定时关机操作详解
郑州企业网站制作公司,郑州招聘网站有哪些?

