android
TimePicker
浅析
TimePicker
是什么
TimperPicker
是一个继承自FrameLayout
的系统控件。这个控件是所谓的“组合控件”。
什么是所谓的“组合控件”:个人理解就是,把一些(一些肯定多于一个)原有控件进行封装。一般是通过布局文件把一些原有控件按照规则摆放好,然后封装成一个大的控件。
所有TimerPicker
里面没有重写onMeasure
,onLayout
,onDraw()
这些View
绘制相关的方法;也没有重写onInterceptTouchEvent()
,onTouchEvent()
这样的交互方法。
不过TimePicker
里面用到了一个概念叫Delegate
,翻译过来似乎是“代理”的意思。不清楚这是不是传说中的代理模式。不过这个和Java
中的动态代理不是一个概念。
动态代理肯定要用到:
java.lang.reflect.Proxy
了。
这里的Delegate
是很有意思的,会根据调用者设置的TimePicker
的android:timePickerMode="clock"
或者android:timePickerMode="spinner"
来加载不同的布局。
这里的spinner
模式,是对NumberPicker
的组合封装。可以看一下大致的布局。
想看一下
spinner
模式下的效果图:可以看一下这个链接
spinner
模式的布局文件
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2011, The Android Open Source Project
*/
-->
<!-- Layout of time picker -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/timePickerLayout"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
>
<LinearLayout android:orientation="horizontal"
android:layoutDirection="ltr">
<!-- hour -->
<NumberPicker
android:id="@+id/hour"
/>
<!-- divider -->
<TextView
android:id="@+id/divider"
/>
<!-- minute -->
<NumberPicker
android:id="@+id/minute"
/>
</LinearLayout>
<!-- AM / PM -->
<NumberPicker
android:id="@+id/amPm"
/>
</LinearLayout>
<!-- 只保留了 id , 其他属性删除了 -->
看到这个布局也就明白了 , TimerPicker
就是用3个NumberPicker
横向排列对齐起来的。然后再TimerPicker
的代码里面,主要就是处理时间设置去获取的。
由于TimePicker
代码里面全部是对时间的处理与回调,跟View
本身没有什么关联,这里就不分析了。
关于clock
模式,还没有去看…..
在clock
模式下,用到了一个类:RadialTimePickerView
。是直接继承自View
的,这个类比较复杂…(计算复杂)