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

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

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

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类, 下载该项目只需要替换两个图片即可。

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

时间: 2024-10-06 11:00:09

Android:自定义滚动边缘(EdgeEffect)效果的相关文章

android 自定义滚动上下回弹scollView

这是一个自定义view,在xml布局中用这个view嵌套要使之可以上下回弹的view, 就能实现布局可以滚动上下回弹了,自定义view代码如下: package com.loopfire.meitaotao.view.scrollView; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent;

android 自定义view实现验证码效果(一)

此博客来自:http://blog.csdn.net/lmj623565791/article/details/24252901,感谢博客的无私奉献,在这拿来自己学习下. 自定义控件一直对我来说都比较恐怖,就此有时间好好学习下, 我们知道一个View对象要经过onMeasure()测量 ,onLayout()计算大小,onDraw()到屏幕上,然后根据你的需求看需要那方面就使用了,这是最简单的自定义view,先从最简单的做起 新建一个项目customview1 第一步:先自定义view的属性,首

Android 自定义ScrollView(具有反弹效果的ScrollView,能够兼容横向的滑动)

package com.itau.jingdong.widgets; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import and

android自定义ViewPager之——3D效果应用

今天在github里看到一个3D效果的ViewPager,感觉做出来的ViewPager滑动的时候效果十分的炫,就check out下来研究了一下如何实现的,以及如何使用,将整个ViewPager稍加修改后(主要是处理了一下与项目中其它控滑动控件的事件冲突)后,应用到了自己现在项目中.感觉这个效果真的非常的不错,现在把自己写的一个Demo分享出来. 下面是这个ViewPager嵌入到项目中的效果图: 修改以后,在切换ViewPager时会有立体感,会为自己的应用增色不少.下面把使用的Demo发出

Android——自定义滚动ViewGroup

该自定义控件对外提供getAdapter和setAdapter接口,能够设置要滚动显示的View(每个View默认显示全屏幕宽高) public class ScrollerViewGroup extends ViewGroup { private int screenHeight;//the phone screen height private int currentY;//记录当前当前的Y位置 private int startScrollY;//记录手指按下触摸事件时的Y方向的滚动位置

android 自定义View弯曲滑竿指示器

android 自定义弯曲滑竿指示器 效果说明:滑竿指示器,是一段弯曲的圆弧,要求在杆上,有滑动小球事件,小球会根据下标文字的起始角度与终止角度,是否选择滑倒下一个位置.当点击下标文字时,小球也要做出相应的指示. 1)MainActivity package com.example.chenkui.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import and

android 自定义scrollview 仿QQ空间效果 下拉伸缩顶部图片,上拉回弹 上拉滚动顶部title 颜色渐变

首先要知道  自定义scrollview 仿QQ效果 下拉伸缩放大顶部图片 的原理是监听ontouch事件,在MotionEvent.ACTION_MOVE事件时候,使用不同倍数的系数,重置布局位置[注此处是伸缩隐藏,不是同比例放大] inner.layout(normal.left, (int) (normal.top + inner_move_H), normal.right, (int) (normal.bottom + inner_move_H)); 关于“自定义scrollview 仿

Android 自定义RecyclerView 实现真正的Gallery效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38173061 ,本文出自:[张鸿洋的博客] 上一篇博客我使用自定义HorizontalScrollView写了一个具有HorizontalScrollView效果和ViewPager特性的横向图片轮播,详见:Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果.其实制作横向滚动的不得不说另一个控件,就是Google

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr