自定义滚轮系列---WheelView实现的大概流程

WhelView滚轮控件的实现过程还是比较复杂,总共加起来有15个文件,很多人一看这么多文件就懵了,不知道从哪里下手,更不知道各个文件之间的关系,这篇文章我们将从该控件控件最主要的部分下手,当然也是最难的一部分—WheelView.class文件。

WheelView.class类文件它是继承自View,所以说它就是一个自定义控件。平常我们自定义一些简单的控件时,往往只要有一个类就够了,让它继承自View或者ViewGroup,然后把所有的实现步骤都写在里面。但是如果对于一个比较复杂的控件来说,如果把所有的实现都写在一个文件里面,必定会出现代码混乱、臃肿,逻辑结构不清晰等问题,所以对于实现一个复杂的控件来说是一种艺术,它不仅涉及到基本控件的使用,它还对算法,设计模式有一定的要求。

写过自定义控件的人都知道,View定义了绘图的基本操作,而基本操作又由三个函数完成:measure()、layout()、draw(),其内部又分别包含了onMeasure()、onLayout()、onDraw()三个子方法。关于自定义控件以及它的这三个方法的具体作用及实现在这里就不跟大家详细讲解了。
我这里推荐几篇博客,希望对大家理解自定义View有帮助:
1、Android自定义控件
2、Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
3、继承ViewGroup:重写onMeasure方法和onLayout方法
4、onMeasure和onLayout理解

当然如果仅仅只是实现了这几个方法,我们一般只能实现一些简单的控件,一般是静态的(内容不会有变化,或者变化不多的)控件,而如果我们要实现一些稍微复杂的控件,比如界面会随着手势的移动而变化,手势划过之后进行翻页等等,这时候我们就要对手势进行监听了,根据手势的方向以及手指移动的距离来动态改变滚轮的内容。我们这里要实现的WheelView控件就是要根据手势的滑动来更新滚轮的内容,因此我们在WheelView中还重写了onTouchEvent()方法。在源代码中我们可以看到,WheelView的onTouchEvent()方法是调用了WheelScroller的onTouchEvent()方法,也就是说最终的手势处理方法是在WheelScroller方法中处理的,下面是WheelView中一些方法的调用关系:
自定义滚轮系列---WheelView实现的大概流程_第1张图片

在上面的onTouchEvent()方法中,我们看到了这样一句,scroller.onTouchEvent();scroller是WheelScroller的实例,因此最终的手势是交给了WheelScroller的onTouchEvent()方法来处理,onTouchEvent();的具体实现过程我们暂时不详述,大家可以去看WheelScroller的源码,下面是WheelScroller类的类图结构:
自定义滚轮系列---WheelView实现的大概流程_第2张图片
在上面的类图中我们看到在WheelScroller类中定义了一个内部接口,ScrollingListener,它里面定义了四个抽象的方法,我们这里使用接口主要有以下几个作用:
1、封装思想的体现;
2、一种对那些在同一个地方使用的接口进行逻辑上分组;
3、嵌套接口可以增强代码的易读性和可维护性;
4、提高类的可扩展性
首先我们把相关的功能集中在一个接口里面,体现了封装思想;当然这些功能之间都有一定的相似性,关联性,而且他们都在同一个地方使用到了,因此也是对它们进行了逻辑上的分组;另外由于把一些功能相近的功能放在一个接口中,接口中有哪些功能,一目了然,增强了代码的可读性;最后是提高了代码的可扩展性,因为接口最终是要被用户实现的,而用户在实现接口时具有很大的自由性,因此可扩展性很高。我们的接口是在WheelScroller中定义的,也是在WheelScroller中被调用的,但是他是在WheelView中实现的。
接口的使用可谓是一门艺术,一门哲学;把接口使用好了对编程有很大的作用,希望大家有兴趣可以去了解接口,下面推荐几篇关于接口的博客:
java类中定义接口的有哪些好处
Java中的内部接口
上面只是介绍了一下WheelView实现的大概流程,我们知道最终手势事件是交给了WheelScroller中的onTouchEvent()方法来处理的,我们现在还不清楚onTouchEvent()方法如何对事件进行处理,关于如何处理我们在这一篇博客暂时不讲。但是我们知道最终肯定是要进行滚动的,所以说滚动是最终的关键。所以我们接下来的问题是“它如何滚动呢,而且要实现平滑地滚动?”。平滑滚动主要是用到了一些手势以及Scroller方面的知识,有兴趣的话大家可以先去了解Scroller的源码,以及手势相关的知识,这对理解屏幕滚动有很大的帮助。我这里也提供一些与Scroller相关知识的比较好的博文,希望对大家有帮助:
Scroll的用法
Scroller的应用–滑屏实现
从源码出发:ScrollView实现以惯性滑动的形式滑动到任意位置/禁止惯性滑动/监听惯性滑动
用户手势检测-GestureDetector使用详解

你可能感兴趣的:(Android)