Android 中的Call模块(我们能看到的Call UI),隶属于App层,所以就从sources/packages/apps/Contacts(注意:Call模块并不是定义在apps/Phone 下面)这里开始。我使用的是代号为froyo的Android 2.2的代码。
Contacts模块下主要有以下几个文件和目录,附件上简要的说明:
+res
|- anim (定义的一些动画效果)
|- dummy_animation.xml
|- quickcontact.xml
|- quickcontact_above_enter.xml
|- etc
|- color-finger (文本的颜色管理)
|- dialer_button_text.xml (拨号盘的颜色管理,默认是白色,按下后是黑色)
|- kind_title.xml
|- tab_indicator_text.xml
|- drawable(-finger | -hdpi | -hdpi-finger | -mdpi | -mdpi-finger)
|- *.xml (用于管理同一元素不同状态下的图片显示,由<selector>元素描述)
|- *.png (图片资源)
|- layout(-finger | -land-finger | -long-finger | -long-land-finger)
|- *.xml (布局文件)
|- menu (菜单资源)
|- edit.xml
|- list.xml
|- view.xml
|- values(*)
|- attrs.xml (自定义的一些属性值)
|- colors.xml (处理通话过程中的颜色显示)
|- dimens.xml (定义的一些OTA二维属性,比如高度)
|- donottranslate_config.xml (一些配置)
|- ids.xml (InCall状态下菜单的id定义等)
|- strings.xml (字符串管理)
|- styles.xml (外观与样式管理)
|- xml
|- searchable.xml
+src
|- com
|- android
|- contacts
|- model (MVC模式中的model)
|- ui (MVC模式中的view)
|- widget
|- *.java
|- util (MVC模式中的controller)
|- *.java
+tests (用于单元测试)
|- res
|- drawable
|- xml
|- src
|- com
|- android
|- contacts
|- unit
|- *.java
|- Android.mk
|- AndroidManifest.xml (单元测试项目声明文件)
Android.mk
AndroidManifest.xml (项目声明文件)
CleanSpec.mk
MODULE_LICENSE_APACHE2
NOTICE
——————————————————————————–
下面结合上述框架内的细节做一些简单说明。
1. Alternative Resources 可替换资源
注意到Contacts模块下的res文件夹中有很多诸如 drawable-finger,drawable-mdpi-finger,layout-land-finger,layout-long- land-finger的文件夹。这是Android为了适应不同参数的设备而采取的资源管理策略。例如,对于不同分辨率的手机应该使用不同大小的图片资 源,这些都各自定义在自己的drawable文件夹下;还有,横屏和竖屏状态下应用程序的布局应该有所不同;对于不同国家的设备,应该有相应的语言显示 等。我们用如下的方式定义这种格式:
<resources_name>-<config_qualifier>
config_qualifier可以有多个属性,每个属性中间用 – 分开。
下面简单列举几个常见的config_qualifier:
-finger 用于触摸屏的设备
-hdpi 近似于240dpi的高级显示密度的屏幕
-mdpi 近似于160dpi的中级显示密度的屏幕
-ldpi 近似于120dpi的低级显示密度的屏幕
-land 横屏显示
-port 竖屏显示
-long 比较长的屏幕,例如WQVGA(432×240), WVGA(800×480), FWVGA(854×480)
2. Dimension Units 尺寸单位
关于尺寸大小,主要有几个单位需要区分开来:px,dp,sp,pt,px,mm,in
px pixel,像素,这个不用过多说明。
dp Density-independent Pixels,中文叫密度无关的像素,在Android中可以用dip或dp表示,例如 android:layout_width="88dp"。在讲dip之前,我们应该先了解dpi的概念。DPI,Dots per Inch,即每英寸包含的点,一英寸约等于2.54cm,所以dpi的概念很容易在脑海中形成了。DPI是用来描述图像打印密度的单位,DPI越高,说明 打印出来的图像越细腻清晰。在72dpi的计算机中dpi就是每英寸包含的像素数。dip是针对160dpi屏幕所定义的像素单位,即在160dpi的屏 幕上,1px = 1dip. 例如,对于同样比例的4英寸屏幕,一个是160dpi,一个是320dpi,那么20px在第一个屏幕中的宽度将是第二个中的两倍,这样就造成了比例失 调,但如果是20dp,那么在第一块屏幕中将占20px,在第二块中占40px,所占屏幕宽度的比例是一样的。因此,dp消除了不同类型屏幕对布局的影 响。
sp Scale-independent Pixels,比例无关的像素。其实这个在绝大多数情况下和dp是等价的,除非其用于字体文件参数时。
pt point,点,表示屏幕物理尺寸的1/72大小。
mm和in分别表示毫米和英寸,均表示屏幕的物理大小。
3. Nine-Patch 图片格式
这是一种可以自定义伸缩的图像,Android会自动调整图像的大小来容 纳显示的内容。我们将某一视图的背景图像的属性定义成"wrap_content"的时候,该背景图片要根据视图的内容自动伸缩,这就是9 patch图片的典型应用。拿前面说到的btn_dial_pressed.9.png图像(9-patch图像均以.9.png作为扩展名)来说明。这 个图像其中一个位于Contacts/res/drawable-mdpi-finger下,它的实际大小如下图所示:
当它用于按下键盘时,它就会被扩展成如下样式:
(不包含黑色边框)
很明显,宽度方向被扩展了。我们还可以使用SDK自带的工具draw9patch.bat来制作自己的9-patch图像,该工具位于SDK的tools目录下。
关于9-patch的详细说明,请查看另外一篇关于draw9patch的博客