美文网首页
Chapter 03. 理解UI

Chapter 03. 理解UI

作者: GeekGray | 来源:发表于2018-10-12 20:38 被阅读9次

    阅读原文

    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。

    • px:代表像素,即在屏幕中可以显示最小元素单元。应用程序中任何控件都是由一个个像素点组成的。分辨率越高的手机,屏幕的像素点就越多。因此,如果使用px来控制控件的大小,在分辨率不同的手机上控件显示的大小也不同。

    • pt:代表磅数,一磅等于1/72英寸,一般pt都会作为字体的单位来显示。pt和px的情况类似,在不同分辨率的手机上,用pt控制的字体大小也会不同。

    • dp:代表密度无关像素,又称dip。1dp单位在设备屏幕上总是等于1/160英寸。使用dp的好处是无论屏幕密度如何总能获得同样尺寸,推荐控件与布局时使用。

    • sp:代表可伸缩像素,采用与dp相同的设计理念,推荐设置文字大小的时使用。


    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 样式和主题

    • 样式:Android中的样式和Css样式作用相似,都用于为界面元素定义显示风格,它是一个包含一个或者多个View控件属性的集合。样式只能应用于单个的View,如EditText、TextView,使用样式可以指定多个控件具有的重复属性,避免书写大量重复代码。

    • 主题:主题也是包含一个或者多个View控件属性的集合,但它的作用范围不同。主题通过AndroidManifest.xml中的<application>和<activity>结点用于整个应用或者某个Activity,它的影响是全局性的。如果一个应用中使用了主题,同时应用下的View也使用了样式,那么当主题和样式中的属性发生冲突时,样式的优先级高于主题。

    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常用指令

    • adb start-server:开启adb服务
    • adb devices:列出所有设备
    • adb logcat:查看日志
    • adb kill-server:关闭adb服务
    • adb shell:挂载到Linux的空间
    • adb install<应用程序(加扩展名)>:安装应用程序
    • adb -s<模拟器名称>install<应用程序(加扩展名)>:安装应用程序到指定的模拟器。
    • adb uninstall<程序包名>:卸载指定的应用程序
    • adb emulator - avd<模拟器名称>:启动模拟器

    相关文章

      网友评论

          本文标题:Chapter 03. 理解UI

          本文链接:https://www.haomeiwen.com/subject/wvxnaftx.html