View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写
由于:public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
View:public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
invalidate();
}
}
}
所以也就相当于scrollBy和scrollTo这两个方法都被重写了。重写的代码中加入校验,当你移动到最上面或者最下面的时候无法再向上移动或向下移动。这就导致了如果简单调用scrollTo无法实现继续移动。如果你还要继续移动的话mScrollY 就为0或者是你内部视图的测量高度-ScrollView的高度。scrollTo是移动到,scrollBy是移动了。如下图:
所以内容向下移动,手指向上滑动,那这个deltaY 就为正,也就是mScrollY =mScrollY +deltaY ,mScrollY 变大直到移动到最下无法移动位置;反之mScrollY 变小直到为0移动到最上面为止。
final float preY = y;
float nowY = ev.getY();
int deltaY = (int) (preY - nowY);
// 滚动,deltaY 为移动的距离,如果要用scrollTo需要计算准确的位置,也就是先前的位置在加上现在移动了多少
scrollBy(0, deltaY);
基于这些就可以重写ScrollView的onTouchEvent并结合ScrollView的内部视图的layout()方法、TranslateAnimation()实现反弹效果。
ScrollView代码:
----------------------------------------------------------------------------------------------------------------------
private View inner;
super(context, attrs);
protected void onFinishInflate() {
if (getChildCount() > 0) {
inner = getChildAt(0);
}
public boolean onTouchEvent(MotionEvent ev) {
System.out.println("onTouchEvent");
if (inner == null) {
return super.onTouchEvent(ev);
} else {
commOnTouchEvent(ev);
}
}
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
y = ev.getY();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
animation();
}
y = DEFAULT_POSITION;
break;
case MotionEvent.ACTION_MOVE:
final float nowY = ev.getY();
float preY = y;
if (isDefaultPosition(y)) {
preY = nowY;
}
int deltaY = (int) (preY - nowY);
// 滚动
scrollBy(0, deltaY);
y = nowY;
if (isNeedMove()) {
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(),
inner.getRight(), inner.getBottom());
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY,
inner.getRight(), inner.getBottom() - deltaY);
}
break;
break;
}
}
private boolean isDefaultPosition(float position) {
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);
public boolean isNeedAnimation() {
return !normal.isEmpty();
}
public boolean isNeedMove() {
int scrollY = getScrollY();
// 位置处于最上和最下
if (scrollY == 0 || scrollY == offset) {
return true;
}
return false;
}
- Rebound.zip (63.1 KB)
- 下载次数: 45
发表评论
-
ScrollView嵌套Edittext
2015-04-08 18:26 794scrollview 中加入多个控件如 edittext 后会 ... -
android 布局式跑马灯,非TextView
2015-04-07 10:51 451如题,简单的实现了跑马灯效果,把Scroll.java放入an ... -
Android圆角图片
2015-03-11 17:44 651my_wane_shape.xml 快速圆角背景边框实现, ... -
SQLite多线程读写实践及常见问题总结
2015-02-13 17:06 904基本操作的部分,大家都很熟悉了,这里根据个人切身经验,总结了一 ... -
android加速度感应
2015-01-19 10:25 14351.android测量数据 (1)android设备坐标系 ... -
MatrixCursor的使用
2015-01-19 09:49 1014ContentProvider对外共享数据的时候的query( ... -
Android 获取控件的宽高高级用法(MeasureSpec)
2015-01-15 14:23 940一个MeasureSpec封装了父 ... -
Android_GridView_GridView概述及实现水平滑动
2015-01-14 17:14 11191.GridView简介 GridView是ViewGroup ... -
Android MMS,SMS之常用Uri
2014-09-19 16:32 1292Android MMS,SMS之常用Uri Android ... -
android短彩信查询以及MMS表结构
2014-09-19 16:31 2109android短信的数据库的Uri是不公开的, 读取起来时灰常 ... -
使用Android自带DownloadManager下载文件
2014-08-19 11:04 735SDK在API Level 9中加入了DownloadMan ... -
android textview里链接点击事件,增加图片
2014-08-07 16:45 1104Android系统默认给TextView插入图片提供了三种方 ... -
android Home事件汇总
2014-07-18 11:30 967方法一:android 4.0以后无法通过更改页面的类型来 ... -
Android风格与主题(style and theme)
2014-07-16 16:35 639Android xml风格和主题文 ... -
Android中播放声音的两种方法
2014-05-30 15:09 609在Android中,音频、视 ... -
android 杀进程方法
2014-05-26 17:43 974关闭应用的方法: 1.System.exit(0); ... -
android service 生命周期
2014-04-21 16:16 740有了 Service 类我们如何启动他呢,有两种方法: ... -
解决ADB端口被占用的问题
2014-04-21 16:14 784究其源就是adb server没启动 经过分析整理如下: ... -
输入法隐藏打开
2013-12-23 14:24 771首次进入activity,如果有个edittex ... -
google经纬度互转
2013-07-11 16:34 896https://developers.google.com/ ...
相关推荐
本Demo自定义了ScrollView控件,来实现上、下拉的反弹效果,提高了用户体验。
Android自定义ScrollView
ScrollView反弹效果,拉到最上面或者最下面继续拉,释放后可以弹回去
自定义的ScrollView控件,实现弹簧效果,也就是说当ScrollView拉到尽头时还可以继续拖动,松开后反弹到原来的位置。注意:ScrollView必须包含在一个大的布局之外
网上找了很多android ScrollView回弹阻尼效果的源码demo,发现都有bug,本人整理了一个demo,实际测试无bug,欢迎下载。
使用RN 的Scrollview 实现轮播图效果
一款非常绚丽的ScrollView动画,让ScrollView的头部实现了伸缩动画效果
android scrollView 拉到最低和最顶端 反弹效果
ScrollView的阻尼回弹效果实现(仿qq空间)
uniapp-scrollview实现双联动。点击标题,scrollview部分对应滑动。scrollview部分滑动,标题部分对应高亮
主要介绍了 Android ScrollView实现反弹效果的实例的相关资料,这里自定义scrollview 并实现反弹效果,需要的朋友可以参考下
ScrollView实现标题栏渐变效果
本文实例为大家分享了Unity实现ScrollView滑动吸附的具体代码,供大家参考,具体内容如下 最近在做一个展示模块的时候遇到了一个需要实现滑动窗口并且能固定吸附距离的需求,借助UGUI的ScrollView的API以及Dotween...
通过自定义ScrollView实现瀑布流功能
使用cocos2d-x2.0.4做的一个scrollview,一战到底游戏的选关界面的实现,里面的资源仅供学习参考使用,如拿去做商业用途,侵权概不负责!
安卓ScrollView分区域上下左右反弹,仿iphone反弹效果
ScrollView滑动悬停效果
Android平台下使用ScrollView滚动效果代码,详细可以参见博客:http://www.cnblogs.com/plokmju/p/android_ScrollView.html