开发的过程中,发现自己应用所有可滑动的控件的顶部和顶部都出现了颜色区块,这本来不是什么大问题,因为其他应用都会有的,问题在于自己应用的区块颜色居然是“紫色”的,这就不能容忍了,实在太“gay”。而且应用的主色调是天蓝色,这样突然来个“紫色”非常影响美观。


于是百度上找了很多帖子,来来去去都是一些不存在的方法或者不生效的方法,最后唯一有效的就是去掉阴影的方法,也就是setOverScrollMode(NEVER)[方法大概是这样...]。于是乎就使用了此方法暂时回避问题。


后来应用差不多完工了,时间也多了很多出来,于是乎不死心的我抱着一丝希望又一次地上百度找方法,结果...和之前没差。于是我怒了,心想:求人不如求己,我自己看源码去!


就是这样,我了其中的奥秘,解决了心中一直纠结的问题。


当然,可能这里有个疑惑,源码这么庞大,该去哪找?其实我也不可能是漫无目的地从好像茫茫大海的源码海里面找出来的。这里我做了一个推理:既然setOverScrollMode(NEVER)这个方法能控制区块消失,那必然就跟区块有联系,于是乎我就一直顺藤摸瓜的找回去,最后终于给我找到了控件颜色的源码,下面来看看我找到这块源码的过程吧:


android 控件滑动过程中的回弹效果 android滑动选择控件_控件


这里就是方法setOverScrollMode(NEVER)的源码[这是View类的源码],可以看到里面最后赋值给了mOverScrollMode,所以这里就可以查找mOverScrollMode在哪里被调用了。


结果发现,mOverScrollMode除了在构造函数被赋值了之外,就只有下面这个方法中调用过。


android 控件滑动过程中的回弹效果 android滑动选择控件_api_02


而这个方法最后调用了一个方法:


android 控件滑动过程中的回弹效果 android滑动选择控件_手机_03


该方法是在View类里面是一个空方法:


android 控件滑动过程中的回弹效果 android滑动选择控件_控件_04


所以也就是要看子类的实现了。


于是我查看了其中一个子类

android 控件滑动过程中的回弹效果 android滑动选择控件_手机_05



然后看到了子类的在该方法中重写的代码

android 控件滑动过程中的回弹效果 android滑动选择控件_源码_06



这里面涉及了一个mScroller的成员变量,而在该对象定义的地方我看到了另外两个成员变量:

android 控件滑动过程中的回弹效果 android滑动选择控件_源码_07



很明显,一个Top,一个Bottom,前面用了Edge这个单词,所以说,区块跟这两个变量脱不了关系。于是乎我在ScrollView中寻找这两个变量赋值的地方,最后在这里找到

android 控件滑动过程中的回弹效果 android滑动选择控件_android_08



这里重写了父类View的setOverScrollMode(NEVER)方法,同是看到对两个变量进行了赋值。除了这个地方,在ScrollView类里面我找不到其余对其进行赋值的地方,同时我也没有找到ScrollView上有能get到这两个变量的方法,而且这两个方法在ScrollView中是私有的。也就是说,在代码上,我们无法达到对区块颜色进行修改的目的。但是这里我看到了这两个变量实例化时需要用到Context,所以我进去看了一下构造函数,结果令我意想不到:

android 控件滑动过程中的回弹效果 android滑动选择控件_源码_09



很明显,区块的颜色就是这里决定的,而这里引用到了资源文件的值,所以说,我们可以通过修改资源文件来达到修改区块颜色的目的。于是乎我们可以在style文件里找进行配置:

android 控件滑动过程中的回弹效果 android滑动选择控件_android_10



这里报了后波浪线错误

android 控件滑动过程中的回弹效果 android滑动选择控件_源码_11


提示API要在21以上才有这个方法,也就是说,21以下不会生效,估计21以下区块颜色有其他设置方法,我手上没有21以下的手机,所以没研究。如果应用的版本最小也小于等于21的可以直接在style文件中添加上面的一行;如果是最大大于21但最小小于21的,可以在res文件夹里面创建一个values-v21的文件夹,好像我这样:

android 控件滑动过程中的回弹效果 android滑动选择控件_控件_12


之后版本21以上的机子就没有问题了。而21以下的机子就要自己再找其他方法解决了。

android 控件滑动过程中的回弹效果 android滑动选择控件_手机_13



顺带一提,区块颜色应该只能设置一种,就是说,并不能A滑动控件的阴影区块是红色,B滑动控件的阴影区块是黄色这样。


文章写这么长其实也是想分享一下我自己的学习方法,我平时遇到困难在网上找不到答案的情况下,便会选择去看源码,源码的英文注释也不算太难,基本都能看懂,看不懂也可以百度翻译一下,也能懂个大概。其实看源码真的是个好东西,通过源码可以学到更多,也可以欣赏到那些编写源码的高级程序员的“美妙作品”。所以希望同学们不要浪费这么好的东西,多去看看,增长自己的见识,开拓自己的思路。


文章到此结束,第一次写文章,文笔不好,请见谅,如果上面有什么错误的,也请指正和见谅。高手也请无视,之所以发表这篇文章是因为我实在在百度上找不到相关的解决方法[也可能是我搜索技巧太水T.T],所以才决定在这里就献丑,希望今后有和我相同需求的同学们能得以解决此问题。