计算器:键盘面板的实现分析
2016-10-20 小文字
前言
Andorid5.+ 之后,系统自带的程式用户体验都很不错,本文作为分析计算器实现的第一篇文章,从输入的数字面板开始扒一下大厂的app设计;
逼格从自定义数字面板开始
打开计算器,看到的界面类似上图,上半部分是输入/结果显示区域,下半部分是“九宫格”的数字和操作运算符;这个九宫格站在开发者的立场,可能会使用诸如GridView,嵌套的LinearLayout等等实现方案;
但是,大厂的答案是,都不;直接定义了一个轻量级的九宫格容器CalculatorPadLayout,可以用于数字,操作符,科学运算操作符这三大块;
下面来看看这个九宫格的实现;
首先定义了两个大家都熟悉的属性,用于设置行,列数;
private int mRowCount;
private int mColumnCount;
整个布局继承自ViewGroup,使用MarginLayoutParams作为布局控制;
最关键的实际上就是onLayout,在这里组行放置元素;和GridView布局类似,这里是等分的,通过前面设置的列数,计算每个元素的宽度,和高度
键盘数字国际化
上面的九宫格基本可以直接用来作为数字键盘放置数字,这里需要介绍对应的数字键盘的实现类CalculatorNumericPadLayout,该类继承自CalculatorPadLayout,区别在于对数字的展示处理。
第一眼看到这个类的实现时觉得挺奇怪的,为什么数字需要动态的在inflate后设置,而具体的按钮却是在xml中定义;
其实这个和国际化有关,全世界绝大多数国家都是用阿拉伯数字在计数,但是也有例外,比如拉丁文,因此这里会根据Locale信息和配置,决定以哪种数字显示;
国际化有很多写法,没有用常规的values直接定义,猜测可能是出于计算显示的可配性,毕竟不是所有使用拉丁问的都不使用阿拉伯数字;
无论如何,我们还是先看看google是怎样设置的数字键盘:
首先在xml中配置了12个按钮,分别用于显示数字0-9,小数点,以及等号;
这些按钮都设置了相同的点击事件,数字键都没有设置文案,有动态配置,每个按钮有独立的id,用于动态识别;
设置数字的代码在layout加载完毕后的onFinishInflate方法中,如下:
运算符
这里实际上就是加减乘除的运算符;和数字面板基本一致,只不过不需要动态设置文案,因此可以直接用CalculatorPadLayout作为容器
科学计算运算符
除了执行简单的加减乘除,计算器一般都会支持一些常用的科学基础,比如求根,三角运算等;
竖屏模式
在竖屏下,操作键盘包括的上述三部分无法全部一起显示出来,因此这里是折叠的,实现上用了ViewPager显示为两屏,这里因为用的是Viewpager实现,因此还是比较有意思的,下面一起看一下这个分屏是如何实现的。
CalculatorPadViewPager即是我们提到的ViewPager,内部设置了一些api来实现不同于常规Viewpager滑动的效果;
首先是PageTransformer,这个经常用在改变Viewpager每页的切换动画,因此也可以用来改变view的位移量;
另一个是OnPageChangeListener,当切屏后,递归设置键盘按钮的可用性,
横屏模式
上面的分析基板上也适用于横屏模式,计算器默认是支持横竖屏的,在横屏下,键盘是全部展开的,而不向竖屏那样由于显示空间的问题折叠起来;
小结
在Andorid自带程序中,计算器相对来说工程量比较小,分析起来也比较容易,了解了每个环节的实现后,就可以根据个人喜好进行二次开发了,这一点做ROM的开发人员应该特别熟悉
分析用的代码院子google源码,也可以在这里获取:计算器源码