`

Android:自定义滚动边缘(EdgeEffect)效果

 
阅读更多

Android可滚动控件(GridView、ListView、ScrollView等)当用户滚动到头的时候会有个边缘反馈效果,在4.0上默认为Holo蓝色效果。  如果您的App自定义了主题颜色,比如Google Play Music的橘黄色。 那么在滚动内容控件还是用默认的Holo蓝色边缘效果看起来可能不太协调。这个时候就需要自定义边缘效果了。

边缘效果在Android系统中是通过EdgeEffect类来实现的,在该类的的构造函数中使用两个系统图片来绘制边缘效果:

1
2
3
final Resources res = context.getResources();
mEdge = res.getDrawable(R.drawable.overscroll_edge);
mGlow = res.getDrawable(R.drawable.overscroll_glow);

4.0默认的这两个图片如下(点击链接查看图片):

所以要实现自定义边缘效果,只需要hack系统在获取这两个图片的时候使用您App提供的图片即可。

Android系统的App是通过ContextWrapper类来获取Resources类,然后通过Resources类来获取各种资源。所以通过自定义这两个类并把自定义的类应用到这些滚动控件中即可。

首先自定义Resources类,在该类中如果判断需要获取上面这两个边缘效果图片,就返回自定义的图片(ResourcesEdgeEffect.java):

public class ResourcesEdgeEffect extends Resources {
    private int overscroll_edge = getPlatformDrawableId("overscroll_edge");
    private int overscroll_glow = getPlatformDrawableId("overscroll_glow");
 
    public ResourcesEdgeEffect(AssetManager assets, DisplayMetrics metrics, Configuration config) {
        super(assets, metrics, config);
    }
 
    private int getPlatformDrawableId(String name) {
        try {
            int i = ((Integer) Class.forName("com.android.internal.R$drawable").getField(name).get(null)).intValue();
            return i;
        } catch (ClassNotFoundException e) {
            Log.e("[ContextWrapperEdgeEffect].getPlatformDrawableId()", "Cannot find internal resource class");
            return 0;
        } catch (NoSuchFieldException e1) {
            Log.e("[ContextWrapperEdgeEffect].getPlatformDrawableId()", "Internal resource id does not exist: " + name);
            return 0;
        } catch (IllegalArgumentException e2) {
            Log.e("[ContextWrapperEdgeEffect].getPlatformDrawableId()", "Cannot access internal resource id: " + name);
            return 0;
        } catch (IllegalAccessException e3) {
            Log.e("[ContextWrapperEdgeEffect].getPlatformDrawableId()", "Cannot access internal resource id: " + name);
        }
        return 0;
    }
 
    public Drawable getDrawable(int resId) throws Resources.NotFoundException {
        if (resId == this.overscroll_edge)
            return ContextWrapperEdgeEffect.this.getBaseContext().getResources().getDrawable(R.drawable.overscroll_edge);
        if (resId == this.overscroll_glow)
            return ContextWrapperEdgeEffect.this.getBaseContext().getResources().getDrawable(R.drawable.overscroll_glow);
        return super.getDrawable(resId);
    }
}

 然后自定义一个ContextWrapper类(ContextWrapperEdgeEffect.java):


public class ContextWrapperEdgeEffect extends ContextWrapper {
 
    private static ResourcesEdgeEffect RES_EDGE_EFFECT;
 
    public ContextWrapperEdgeEffect(Context context) {
        super(context);
        Resources resources = context.getResources();
        if (RES_EDGE_EFFECT == null)
            RES_EDGE_EFFECT = new ResourcesEdgeEffect(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
    }
        //返回自定义的Resources
    public Resources getResources() {
        return RES_EDGE_EFFECT;
    }
}
 最后再自定义App中使用到的滚动控件,把Context对象替换为前面自定义的ContextWrapperEdgeEffect类即可(如下是GridView的示例):
public class GridView extends android.widget.GridView {
 
    public GridView(Context context, AttributeSet attrs) {
        super(new ContextWrapperEdgeEffect(context), attrs);
    }
 
    public GridView(Context context, AttributeSet attrs, int defStyle) {
        super(new ContextWrapperEdgeEffect(context), attrs, defStyle);
    }
 
}
 然后让您的UE同学按照Holo蓝色边缘效果的两张图来提供自定义的两张图即可。

如果您感觉上面这些步骤比较繁琐的话,也可以下载EdgeEffectOverride 这个项目,该项目已经实现了ListView、GridView、ScrollVeiw、ExpandableListView和ViewPager类, 下载该项目只需要替换两个图片即可。

下图是一个自定义红色效果的截图:



 

分享到:
评论

相关推荐

    安卓动画效果相关-EdgeEffectOverride滚动控件滚动到边缘的颜色效果.rar

    1. 自定义EdgeEffect:开发者可能创建了一个名为`CustomEdgeEffect`的类,该类继承自`EdgeEffect`,并在其中重写了`onPull()`、`onRelease()`和`draw()`方法,以实现自定义颜色的效果。 2. 示例代码:可能包含了一个...

    EdgeEffectOverride滚动控件滚动到边缘的颜色效果.rar

    这个压缩包的内容对于想要深入理解Android自定义View和滚动效果的开发者来说,是一份宝贵的参考资料。通过分析和学习其中的代码,开发者不仅可以掌握自定义EdgeEffect的技术,还能提升自己在Android UI设计上的能力...

    android 滚动回弹

    2. **自定义EdgeEffect**:Android提供了一个名为EdgeEffect的类,用于处理滚动到边缘时的视觉反馈。可以通过继承EdgeEffect并重写其`onPull()`、`onRelease()`等方法来实现自定义的回弹动画。然后将这个自定义的...

    ListView ViewPager ScrollView 修改边界色

    接下来,我们需要在ListView的AdapterViewLayout属性中应用这个自定义的EdgeEffect: ```xml android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" ...

    Android ListView反弹效果源码-IT计算机-毕业设计.zip

    OverscrollDecoratorHelper是Google官方推荐的库,用于在Material Design风格的应用中添加边缘过度滑动效果,而EdgeEffect则是Android系统自带的一种实现方式,它可以为滚动视图添加弹性边缘。 6. **自定义...

    android material design 之recyclerview

    同时,可以通过EdgeEffect或OverScrollDecoratorHelper来定制滑动边缘的效果。 通过以上知识点的学习和实践,开发者能够充分利用RecyclerView的强大功能,打造高效、美观的Android应用界面。在实际开发中,不断探索...

    横向listview

    对于RecyclerView,可以使用`EdgeEffect`或自定义`OverScroller`来处理滚动到边缘时的弹性效果。 **三、HorizontalListView与RecyclerView的比较** - **灵活性**:RecyclerView比HorizontalListView更灵活,支持...

    DragPageView

    为了实现吸附效果,开发者可能使用了EdgeEffect或者自定义的动画效果,使得视图在接近边界时产生反弹或吸合的视觉反馈。 此外,为了保证流畅的滑动体验,DragPageView可能还采用了OverScroller或Scroller类来处理...

    android手势翻页

    可以使用EdgeEffect或者自定义ViewGroup来实现这种效果,当用户在屏幕边缘滑动时,可以显示出特殊的视觉反馈,比如拉伸或撕裂效果。 5. 调整阈值: SWIPE_THRESHOLD 和 SWIPE_VELOCITY_THRESHOLD 是用于判断是否为...

    SlideDrawer的使用和运行所有程序。

    SlideDrawer,通常被称为侧滑抽屉菜单,在Android应用开发中是一种常见的设计模式,它允许用户从屏幕边缘滑动以展示附加的导航或设置选项。在Android应用中,SlideDrawer经常被用于实现类似iOS中的侧滑菜单效果,为...

    安卓右侧右滑返回

    此外,为了保持一致性,Android系统在API级别26(Android Oreo)及以上版本提供了SystemUI中的EdgeSwipeDetector和EdgeEffect组件,可以更方便地实现边缘滑动返回。但需要注意的是,这些系统级别的组件可能需要特定...

    DrawerLayout:Split DrawerLayout 从 AOSP 实现。 独立模块

    抽屉布局(DrawerLayout)是Android开发中常用的一种组件,常用于实现侧滑菜单效果,让用户可以方便地从屏幕边缘滑出附加的功能或内容。在Android原生代码库(AOSP,Android Open Source Project)中,DrawerLayout...

Global site tag (gtag.js) - Google Analytics