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默认的这两个图片如下(点击链接查看图片):
- overscroll_edge:overscroll_edge.png
- overscroll_glow:overscroll_glow.png
所以要实现自定义边缘效果,只需要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的示例):
相关推荐
<!----> README 中文版 About ...support setting the color of EdgeEffect contains appropriate PageTransformer for vertical scrolling Screen Record horizontal and vertical scroll
EdgeEffectOverride, 替代全息EdgeEffect颜色 EdgeEffectOverrideEdgeEffectOverride的库旨在帮助覆盖蓝色 overscroll_edge 和 overscroll_glow EdgeEffect类使用的effects效果 effects 。
基于matlab实现二维小波时频图;图像;二维;时频分析;结决问题.rar
pentair 5800 SXT软水机说明书
数据来源:中国电力统计NJ-2021版
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国劳动统计NJ-2023版
数据来源:中国电力统计NJ-2021版
基于HarmonyOS 4开发的一款新闻类的鸿蒙APP源代码
数据来源:中国人口与就业统计NJ-2023版
重庆大学图书管理系统设计与实现 毕业论文设计(51页).doc
数据来源:中国电力统计NJ-2021版
数据来源:中国电力统计NJ-2021版
PostgreSQL9.6x64-HaoSQL
GEM20U系列曲折缝纫机使用说明书
企业培训管理系统设计与实现.doc
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国劳动统计NJ-2023版
基于matlab实现的LTE 仿真平台 国外维也纳大学网站 MATLAB仿真.rar
数据来源:中国人口与就业统计NJ-2023版