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的详细说明,请参阅SDK文档中关于2D图形的说明。 |
|