Chapter 03. 理解UI

2018-10-12  本文已影响9人  GeekGray

阅读原文

3.1 理解UI

3.1.1UI的定义

全称user interface, 意为: 用户界面

• UI由View和ViewGroup组成

• View类是所有视图(包括ViewGroup)的根基类

• View在屏幕上占据一片矩形区域, 并会在上面进行内容绘制

• ViewGroup包含一些View或ViewGroup, 用于控制子View的布局

3.1.2View的API结构

image

3.2 UI事件

当用户通过手指触摸UI时, 系统会自动创建对应的Event对象

• Android中提供了多种方式拦截处理不同类型的事件

• 视图本身就可以处理发生在该视图上的事件

image

Android提供了很多不同类型的事件监听器接口

 View.OnClickListener: onClick()

 View.OnLongClickListener: onLongClick()

 View.OnTouchListener: onTouch()

 View.OnCreateContextMenuListener: onCreateContextMenu()

 View.OnFocusChangeListener: onFocusChange()

 View.OnKeyListener: onKey()

 • 给视图添加事件监听的方式
 view.setOn…Listener(listener)

3.3布局类型

3.3.1RelativeLayout 控件属性

属性声明 功能描述
android:layout_alignParentLeft 是否跟父布局左对齐
android:layout_alignParentTop 是否跟父布局顶部对齐
android:layout_alignParentRight 是否跟父布局右对齐
android:layout_alignParentBottom 是否跟父布局左对齐
android:layout_toRightOf 在指定控件的右边
android:layout_toLeftOf 在指定控件的左边
android:layout_above 在指定控件的上边
android:layout_below 在指定控件的下边
android:layout_alignBaseline 与指定控件水平对齐
android:layout_alignLeft 与指定控件左对齐
android:layout_alignRight 与指定控件右对齐
android:layout_alignTop 与指定控件顶部对齐
android:layout_alignBottom 与指定控件底部对齐

3.3.2控件单位

为了让程序拥有更好的屏幕适配能力,在指定控件和布局宽高的时最好使用“match_parent”或"wrap_content".在布局文件中,指定宽高的固定值有4种方式可供选择:px、pt、dp、sp。


3.3.3线性布局(LinearLayout)

在<LinearLayout>标签中有一个属性android:orientation,该属性的取值有两种,vertical表示线性布局时垂直显示的,horizontal表示线性布局水平显示,默认为horizontal。

3.3.4表格布局(TableLayout)

在TableLayout中,行数由TableRow对象控制,即布局中有多少TableRow对象,就有多少行。每个TableRow中可以放置多个控件。列数由最宽的单元格绝定,假如第一个TableRow有两个控件,第二个TableRow有三个控件,那么这个TableLayout就有三列。在控件中通过android:layout_column属性指定具体的列数,该属性值从0开始,表示第一列。

android:stretchColumns="2"属性表示第三列拉伸,android:layout_column="0"属性表示该控件显示在第一列中。

需要注意的是,TableRow不需要设置宽度layout_width和高度layout_height,其宽度一定是match_parent,即自动填充父容器,高度一定为wrap_content,即根据内容改变高度。但对于TableRow中的其他控件来说,是可以设置宽度和高度的,但必须是wrap_content或者fill_parent

3.3.5网格布局(GridLayout)

能够避免因布局嵌套对设备性能的影响,更利于自由布局的开发。网格布局用一组无限细的直线将绘图区域分成行,列和单元,并制定控件的显示区域和控件在该区域的显示方式。网格布局中的控件可以很整齐的排列,并且可以控制每个控件所占的行数和列数。

属性声明 功能描述
android:layout_column 表示该控件在第几列
android:layout_arowSpan 表示该控件占用几行
android:layout_columnSpan 表示该控件占用几列

3.3.6帧布局(FrameLayout)

帧布局为每个加入其中的控件创建一个空白区域(称为一帧,每个控件占据一帧)。采用帧布局设计界面时,只能在屏幕左上角显示一个控件,如果添加多个控件,这些控件会按照顺序在屏幕的左上角叠加显示,且会透明显示之前控件的文本。帧布局是一帧一帧显示的,通常可以用于游戏开发中,并且常与Fragment结合使用。

3.3.7绝对布局(AbsoluteLayout)

绝对布局通过指定x,y坐标来控制每一个控件的位置,放入该布局的控件需要通过android:layout_xandroid:layout_y两个属性指定其准确的坐标值,并显示在屏幕上。例如,android:layout_x="50dp",android:layout_y="50dp"表示该控件x,y坐标都在第50dp像素上

需要注意的是,理论上绝对布局可以完成任何的布局设计,但是在实际的工程应用中不提倡使用这种布局。因为使用这种布局不但需要精确的计算每个组件的大小,而且当应用程序运行在不同手机屏幕上产生效果也不相同,因此,不提倡使用绝对布局。


3.4 样式和主题

3.4.1 自定义样式和主题

1.在res/values目录下创建一个样式文件style.xml(文件名可以自定义),添加一个<resources>根结点。

2.在<resources>结点中添加一个<style>节点,并在该节点中为样式或主题定义一个唯一的名字,也可以选择增加一个父类属性,表示当前风格继承父类的风格

3.在<style>节点中声明一个或多个<item>,每个<item>节点需要定义一个属性名,并在元素内部设置这个属性的值。例如:

<style name="MainButtonStyle">
        <!-- Customize your theme here. -->
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">center_vertical</item>
        <item name="android:button">@android:color/transparent</item>
        <item name="android:drawablePadding">5dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@drawable/bottom_button_text_selector</item>
        <item name="android:textSize">15sp</item>
        <item name="android:layout_weight">1</item>
    </style>

3.4.2 使用自定义样式和主题

1.在布局文件的控件中,通过style="@style/MainButtonStyle"引入定义好的样式即可。

2.在功能清单文件的<activity>节点中,通过android:theme="@style/MyTheme"引入定义好的主题即可。

3.自定义的样式还可以通过parent继承其他已经定义好的样式表,使程序的扩展性更好,

<style name="MoreTextStyle" parent="MainButtonStyle">

    <item name="android:layout_height">wrap_content</item>
    <item name="android:drawablePadding">5dp</item>
    <item name="android:gravity">center_vertical</item>
    <item name="android:padding">20dp</item>
    <item name="android:textColor">@color/more_text</item>
    <item name="android:textSize">25sp</item>

    </style>

3.5 国际化

所谓国际化,就是软件在开发时就应该具备支持多种语言和国家地区的功能,也就是说开发的软件能同时对不同国家地区的用户访问,并针对不同国家和地区的用户,提供相应的、符合来访者阅读习惯的页面数据。由于国际化internationalization这个单词的首字母"I"和尾字母"N"之间有18个字符,因此国际化被简称为I18N。

开发者只需要在res目录下新建几个values文件即可。需要注意的是,新建的values文件是有命名规则的,例如:

values-语言代码-r 国家或地区代码

让软件支持简体中文、美式英语两种环境,需要在res目下新建两个values文件夹,分别命名为values-zh-rCN、values-en-rUS。如果需要为不同国家或地区展示不同的图片,只需要在res目录下创建drawable文件夹即可,命名、匹配规则都和values文件夹的一致,

drawable-zh-rCN

drawable-en-rUS

需要注意的是,在匹配资源时先会找语言、国家或地区完全匹配的,如果没有国家或地区匹配的,则查找语言匹配的。

Android支持图片、文字等资源的国际化。在开发软件的过程中,可以通过使用国际好让软件自适应不同的国家或地区的语言、文化的差异。


3.6 Dalvik虚拟机

Dalvik虚拟机是Google公司自己设计的用于Android平台的虚拟机,它可以简单地完成进程隔离和线程管理,并且可以提高内存的使用效率。每一个Android应用程序在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解析下得以执行。

Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者不兼容,而且也有很多不同之处。

主要有两大区别:一是它们编译后的文件不同;二是它们基于的架构不同。

3.6.1 编译后文件的不同

Java虚拟机运行的是.class字节码文件,而Dalvik虚拟机运行的是其专有的.dex文件。在Java程序中Java类会被编译成一个或者多个字节码文件然后打包成.jar文件,之后使用Java虚拟机会从.class和.jar文件中获取相应的字节码。Android程序虽然也是使用Java语言(大部分)进行编程,但是在翻译成.class 文件后,还会通过工具将所有的.class文件转换成一个.dex文件,然后DAlvik虚拟机从其中读取指令和数据,最后的.odex是为了在运行过程中进一步提高性能而对.dex文件的进一步优化,能加快软件的加载速度和开启速度。

3.6.2 基于架构的不同

Java虚拟机是基于栈的架构,栈是一个连续的内存空间,取出和存入的速度比较慢,而Dalvik是居于寄存器的架构,寄存器是CPU上的一块缓存,寄存器的存取速度要比从内存中存储的速度快很多,这样就可以根据硬件最大限度地优化设备,更适合移动设备的使用。

需要说明的是,Android系统下的Dalvik虚拟机默认给每一个应用程序最多分配16MB内存,如果Android加载的资源超过这个值,就会报出OutOfMemoryError异常,因此一定要注意这个问题。

ART(Android Runtime)是Android4.4系统新增的一种应用运行模式,与传统的Dalvik莫斯不同,ART模式可以实现更为流畅的安卓系统体验。

ART模式与Dalv模式最大的区别在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提高。


3.7 ADB常用指令

上一篇下一篇

猜你喜欢

热点阅读