`

ScrollView反弹效果的实现

 
阅读更多

转载:http://www.eoeandroid.com/thread-100933-1-1.html

 

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是移动了。如下图:
 
2011-9-26 16:24 上传下载附件 (9.45 KB) 

   
                所以内容向下移动,手指向上滑动,那这个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代码:
----------------------------------------------------------------------------------------------------------------------
本帖隐藏的内容需要回复才可以浏览
/**
* ScrollView反弹效果的实现
* 破三军 转载请注明出处
*/
public class MyScrollView extends ScrollView
{
private View inner;

private float y;

private Rect normal = new Rect();;

public MyScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);

}

@Override
protected void onFinishInflate()
{
if (getChildCount() > 0)
{
inner = getChildAt(0);

}
}

@Override
public boolean onTouchEvent(MotionEvent ev)
{
if (inner == null)
{
return super.onTouchEvent(ev);
}
else
{
commOnTouchEvent(ev);
}

return super.onTouchEvent(ev);
}

public void commOnTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
y = ev.getY();
break;
case MotionEvent.ACTION_UP:

if (isNeedAnimation())
{
animation();
}
break;
case MotionEvent.ACTION_MOVE:
final float preY = y;
float nowY = ev.getY();
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;

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);

normal.setEmpty();

}

// 是否需要开启动画
public boolean isNeedAnimation()
{
return !normal.isEmpty();
}

// 是否需要移动布局
public boolean isNeedMove()
{

int offset = inner.getMeasuredHeight() - getHeight();
int scrollY = getScrollY();
if (scrollY == 0 || scrollY == offset)
{
return true;
}
return false;
}

}

 

分享到:
评论

相关推荐

    ScrollView反弹效果实现[bug修正版]

    这篇博客“ScrollView反弹效果实现[bug修正版]”就详细讲解了如何为ScrollView添加弹簧反弹效果,并修复了可能存在的问题。 首先,我们来看一下如何添加弹簧反弹效果。一种常见的解决方案是使用`androidx.core....

    Android ScrollView反弹效果

    本文将深入探讨如何实现一个自定义的ScrollView,以添加上、下拉的反弹效果,从而提高用户的交互体验。 首先,我们需要了解ScrollView的基本用法。ScrollView是一个可以包含单个直接子视图的垂直滚动容器。这意味着...

    Android自定义ScrollView反弹效果

    下面将详细介绍如何在Android中实现自定义ScrollView的反弹效果。 首先,我们需要创建一个新的ScrollView子类,例如命名为`BounceScrollView`。在这个自定义视图中,我们需要重写一些关键方法以实现回弹效果。关键...

    ScrollView反弹效果

    这个“ScrollView反弹效果”就是我们今天要讨论的知识点。 在给定的资源中,"zhy_bounceScrollView02"很可能是包含实现这种反弹效果的代码示例。通常,这种效果是通过自定义ScrollView并重写其滚动相关的计算方法来...

    android scrollView 拉到最低和最顶端 反弹效果

    当用户滚动到ScrollView的顶部或底部时,有时我们希望实现一个反弹效果,即滚动条会在到达边界后短暂地回弹,增加用户体验的流畅感。这个效果通常被称为“橡皮筋效果”或“弹簧效果”,在iOS中称为“弹性滚动”,在...

    scrollview的回弹效果

    在压缩包中的`zhy_bounceScrollView02`文件可能是实现回弹效果的一个示例代码,可能包含了如何设置ScrollView、调整内容偏移量以及实现回弹动画的详细步骤。通过研究这个示例,开发者可以更好地理解如何在实际项目中...

    安卓ScrollView分区域上下左右反弹

    通过以上步骤,我们就可以在Android应用中实现类似iOS的ScrollView反弹效果。这种自定义的ScrollView可以为用户提供更丰富的交互体验,增加应用的吸引力。需要注意的是,实现这种效果需要对Android的触摸事件处理和...

    Android ScrollView实现反弹效果的实例

    以上就是实现Android ScrollView反弹效果的基本步骤。这个过程中,关键在于对触摸事件的处理和动画的实现。通过自定义ScrollView,我们可以精确控制滚动行为,从而提供更丰富的用户体验。需要注意的是,反弹效果的...

    android ScrollView 阻尼回弹效果 仿微信

    而“阻尼回弹”或“橡皮筋”效果则是指在ScrollView滚动到边界时,手指松开后,内容会像橡皮筋一样有一种自然的反弹效果,就像微信朋友圈那样,给人一种更加真实的交互体验。 实现这种效果的关键在于自定义一个...

    自定义ScrollView,实现回弹效果

    然而,原生的ScrollView并没有内置的回弹效果,这种效果通常在iOS设备上可以看到,当用户滑动到内容的边缘时,会有一个弹性反弹的动作,为用户提供一种内容已经到底部或顶部的视觉反馈。本教程将详细介绍如何在...

    【Android】Android开发实现带有反弹效果,仿IOS反弹scrollview详解教程

    博文介绍:http://blog.csdn.net/qq_21376985/article/details/52468306 【Android】Android开发实现带有反弹效果,仿IOS反弹scrollview详解教程

    ScrollView回弹

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要实现ScrollView的回弹效果,也就是当用户滑动到ScrollView的边界时,内容会有一种弹性返回的效果。这种效果增加了交互的趣味性和用户友好性。本篇文章...

    安卓 惯性 滑动 回弹 ScrollView

    你可以通过Scroller的fling()方法设置初始速度、最大滚动距离等参数,然后在onComputeScroll()方法中更新ScrollView的位置,实现惯性滚动效果。 4. **边界检测**:为了实现回弹效果,你需要在每次滚动时检查是否...

    ScrollView ListView 普通布局的回弹效果的实现

    这种效果通常出现在滚动视图(如ScrollView、ListView)的边缘,当用户尝试超出边界滚动时,内容会像弹簧一样反弹回来,给人一种自然且流畅的感觉。本篇文章将深入探讨如何在ScrollView、ListView以及普通的布局中...

    带回弹效果的ScrollView

    动画的时间可以根据实际情况调整,通常会设置得较为短暂,以模拟真实的物理反弹效果。 4. **判断边界**: 在处理触摸事件时,我们需要检测当前的滚动位置是否已经到达顶部或底部。这通常可以通过比较滚动高度和...

    android 苹果的反弹效果

    但是,原生的`ScrollView`并没有内置苹果风格的反弹效果。因此,我们需要通过其他方式来实现这一功能。 一种常见的方法是使用第三方库,如`android-parallax-scroll-view`或者`overscroll-decoration`等,这些库...

    scrollview下拉放大效果,弹回效果动画(基于手势,不导入第三方包)重新上传

    在项目文件"MyApplication"中,可能包含了MainActivity.java、ScrollView放大弹回效果的自定义实现、对应的XML布局文件以及可能的资源文件。MainActivity.java中,开发者可能初始化了ScrollView,设置了手势监听器,...

Global site tag (gtag.js) - Google Analytics