`

ListView 实现阻尼回弹效果 并去除边缘阴影

阅读更多

 我们使用ListView将位置拖到顶部和底部默认是没有回弹效果的,为了增加这个效果,方法如下:
1、开启overScrollMode为always
在布局中
android:overScrollMode="always"
或在代码中
setOverScrollMode(View.OVER_SCROLL_ALWAYS);

2、继承listview 覆盖overScrollBy方法,并且利用反射机制修改阴影效果为透明

public class BounceListView extends ListView {
    private static final int MAX_Y_OVERSCROLL_DISTANCE = 100;
 
    private Context mContext;
    private int mMaxYOverscrollDistance;
 
    public BounceListView(Context context) {
        super(context);
        mContext = context;
        initBounceListView();
    }
 
    public BounceListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        initBounceListView();
    }
 
    public BounceListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        initBounceListView();
    }
 
    private void initBounceListView() {
        // get the density of the screen and do some maths with it on the max
        // overscroll distance
        // variable so that you get similar behaviors no matter what the screen
        // size
 
        final DisplayMetrics metrics = mContext.getResources()
                .getDisplayMetrics();
        final float density = metrics.density;
        mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
         
//      this.setOverScrollMode(View.OVER_SCROLL_ALWAYS);
         
        try {
            Class<?> c = (Class<?>) Class.forName(AbsListView.class.getName());
            Field egtField = c.getDeclaredField("mEdgeGlowTop");
            Field egbBottom = c.getDeclaredField("mEdgeGlowBottom");
            egtField.setAccessible(true);
            egbBottom.setAccessible(true);
            Object egtObject = egtField.get(this); // this 指的是ListiVew实例
            Object egbObject = egbBottom.get(this);
 
            // egtObject.getClass() 实际上是一个 EdgeEffect 其中有两个重要属性 mGlow mEdge
            // 并且这两个属性都是Drawable类型
            Class<?> cc = (Class<?>) Class.forName(egtObject.getClass()
                    .getName());
            Field mGlow = cc.getDeclaredField("mGlow");
            mGlow.setAccessible(true);
            mGlow.set(egtObject, new ColorDrawable(Color.TRANSPARENT));
            mGlow.set(egbObject, new ColorDrawable(Color.TRANSPARENT));
 
            Field mEdge = cc.getDeclaredField("mEdge");
            mEdge.setAccessible(true);
            mEdge.set(egtObject, new ColorDrawable(Color.TRANSPARENT));
            mEdge.set(egbObject, new ColorDrawable(Color.TRANSPARENT));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @SuppressLint("NewApi")
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
            int scrollY, int scrollRangeX, int scrollRangeY,
            int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        // This is where the magic happens, we have replaced the incoming
        // maxOverScrollY with our own custom variable mMaxYOverscrollDistance;
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
                scrollRangeX, scrollRangeY, maxOverScrollX,
                mMaxYOverscrollDistance, isTouchEvent);
    }
}

 使用如上BounceListView就可以实现不带阴影的阻尼效果列表了。

分享到:
评论

相关推荐

    ListView 去除边缘阴影、选中色、拖动背景色等

    ### ListView去除边缘阴影 在Android开发中,ListView是一种常见的组件,用于展示列表数据。当ListView滚动至顶部或底部时,默认情况下会出现一个边缘阴影效果。这种阴影对于某些UI设计来说是不必要的,因此开发者...

    Android实现ListView阻尼效果

    为了提供更好的用户体验,开发者经常会在ListView中实现一种类似物理运动的阻尼效果,即当用户快速滑动ListView到列表顶部或底部时,ListView会有一种“弹跳”或者“回弹”的效果,这种效果被称为“阻尼效果”。...

    自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果

    Android UI设计之&lt;十&gt;自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果,详见:http://blog.csdn.net/llew2011/article/details/51559694

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

    本篇文章将深入探讨如何在ScrollView、ListView以及普通的布局中实现这种回弹效果。 首先,我们来看ScrollView的回弹效果。ScrollView是Android内置的一个可以垂直滚动的单向容器,它允许其内部的组件超出屏幕的...

    android listview 下拉回弹刷新效果

    总之,实现Android ListView的下拉回弹刷新效果,需要结合SwipeRefreshLayout组件、事件监听、自定义动画和性能优化等多个方面。通过这些技术,你可以为你的APP增添类似QQ空间和新浪微博的互动体验,提升用户的使用...

    ListView回弹效果

    本篇文章将详细探讨如何实现ListView的回弹效果,以及其在源码中的实现原理。 “回弹效果”,又称为下拉刷新或滑动加载更多,是一种常见的交互设计,用户通过手势向下拉动ListView,列表会呈现出一个回弹动作,然后...

    《PullScrollView详解(四)——完全使用listview实现下拉回弹(方法一)》对应源码

    博客《PullScrollView详解(四)——完全使用listview实现下拉回弹(方法一)》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/48021931

    Android实现ListView可伸展并回弹功能

    本篇将详细讲解如何实现ListView的可伸展并回弹的功能,即在用户触摸并滑动列表项时,它能像橡皮筋一样拉伸,松手后则会回弹到原始位置。 首先,要实现这个功能,我们需要创建一个自定义的ListView,我们称之为...

    带阻尼效果的listview

    "带阻尼效果的listview"是通过在ListView的滚动过程中添加一个模拟真实世界阻力的算法来实现的。这种效果不仅增加了界面的动态感,还能让用户感觉到操作的连贯性和自然性。在实际应用中,阻尼效果的强弱是可以调整的...

    android listview翻页阻尼效果

    下面将详细介绍如何在ListView中实现翻页阻尼效果: 1. **集成库**:首先,需要在项目中引入`PullToRefresh`库。如果使用Gradle构建系统,可以在`build.gradle`文件中添加依赖。例如,对于`androidx`库,可以添加...

    《PullScrollView详解(五)——完全使用listview实现下拉回弹(方法二) 》对应源码

    博客《PullScrollView详解(五)——完全使用listview实现下拉回弹(方法二) 》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/48087649

    实现ListView头部和尾部可伸展并回弹功能

    然而,为了增强用户体验,有时我们需要实现ListView的头部和尾部可伸展并回弹的效果,这种功能通常被称为“Pull to Refresh”(下拉刷新)和“Load More”(上拉加载更多)。本篇文章将详细介绍如何在Android中实现...

    仿小米lListView回弹效果

    然而,原生的ListView在滚动到顶部或底部时并没有提供回弹效果,这种效果常见于许多应用,特别是小米系统中的滚动体验。"仿小米ListView回弹效果"是一个针对ListView进行优化,模拟小米系统特有的滚动回弹动画的技术...

    Android listView下拉刷新上拉刷新带阻尼效果-IT计算机-毕业设计.zip

    这个"Android listView下拉刷新上拉刷新带阻尼效果"的源码Demo是几年前的一个示例,旨在帮助学生理解和实现Android应用中的下拉刷新和上拉加载更多功能,同时加入了阻尼效果,提升用户体验。阻尼效果是指在用户滑动...

    android listview 背景伸缩回弹

    综上所述,实现"android listview 背景伸缩回弹"效果是一个涉及多个Android开发技术的综合任务,包括自定义ViewGroup、触摸事件处理、动画实现、性能优化等。通过这样的设计,不仅可以让应用更具吸引力,还能提升...

    Android高级应用源码-listView下拉刷新上拉刷新带阻尼效果.zip

    标题中的"Android高级应用源码-listView下拉刷新上拉刷新带阻尼效果.zip"指的是一个Android应用程序,它实现了ListView组件的高级功能,包括下拉刷新(Pull-to-Refresh)和上拉加载更多(Load-more)操作,并且具有...

    listview实现跑马灯效果

    在Android开发中,"ListView实现跑马灯效果"是一个常见的需求,它通常用于展示滚动循环的文字或图片。跑马灯效果使得内容能够自动从一端滚动到另一端,然后无缝衔接回初始位置,给人一种连续循环的感觉,常用于新闻...

    Android开发界面阻尼效果的实现

    在这些组件中,我们可以通过自定义滑动监听器,调整滑动速度和回弹动画,实现侧滑的阻尼效果。 对于ListView的阻尼效果,我们可以使用ParallaxEffect或Header/Footer来实现。ParallaxEffect是指背景视图在滑动时以...

    自定义ListView实现下拉刷新效果

    自定义ListView实现下拉刷新效果 开发中难免会遇到自定义控件这类的,独自开发确实很伤脑经,这一边是关于自己新建一个类继承listview 实现下拉刷新提示效果,希望可以给大家在开发中起到提高效率,给初学者学习。...

Global site tag (gtag.js) - Google Analytics