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
相关文章:
如何基于云服务器快速搭建个人网站?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
建站三合一如何选?哪家性价比更高?
高防服务器租用如何选择配置与防御等级?
为什么Go需要go mod文件_Go go mod文件作用说明
如何通过商城自助建站源码实现零基础高效建站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何实现建站之星域名转发设置?
西安大型网站制作公司,西安招聘网站最好的是哪个?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站企业制作流程,用什么语言做企业网站比较好?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
学校免费自助建站系统:智能生成+拖拽设计+多端适配
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
如何用低价快速搭建高质量网站?
建站之星后台管理如何实现高效配置?
C++中引用和指针有什么区别?(代码说明)
如何选择PHP开源工具快速搭建网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
大型企业网站制作流程,做网站需要注册公司吗?
电商平台网站制作流程,电商网站如何制作?
如何获取免费开源的自助建站系统源码?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何用搬瓦工VPS快速搭建个人网站?
如何零成本快速生成个人自助网站?
企业微网站怎么做,公司网站和公众号有什么区别?
太原网站制作公司有哪些,网约车营运证查询官网?
建站之星如何快速更换网站模板?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
建站主机如何选?高性价比方案全解析
制作网站的基本流程,设计网站的软件是什么?
建站OpenVZ教程与优化策略:配置指南与性能提升
C++如何编写函数模板?(泛型编程入门)
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何通过wdcp面板快速创建网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何选择高效便捷的WAP商城建站系统?
建站之星CMS五站合一模板配置与SEO优化指南
,制作一个手机app网站要多少钱?
如何快速生成橙子建站落地页链接?
个人摄影网站制作流程,摄影爱好者都去什么网站?
建站之星如何快速解决建站难题?
临沂网站制作企业,临沂第三中学官方网站?
如何构建满足综合性能需求的优质建站方案?
如何选择香港主机高效搭建外贸独立站?
*请认真填写需求信息,我们会在24小时内与您取得联系。