layout management - android and qt

24
Layout Management - Android and Qt Roger [email protected] [email protected] www.twitter.com/roger2yi https://plus.google.com/ 2011/8/22 1

Upload: rogeryi

Post on 21-Jun-2015

2.393 views

Category:

Technology


5 download

DESCRIPTION

介绍Android和Qt GUI框架里面的布局管理,包括布局的基本概念介绍和Android与Qt之间差异性的比较。

TRANSCRIPT

Page 1: Layout Management - Android and Qt

Layout Management -Android and Qt

[email protected]@gmail.comwww.twitter.com/roger2yihttps://plus.google.com/

2011/8/22 1

Page 2: Layout Management - Android and Qt

Outline

• Basic Concepts

• Android Layout System

• Qt Layout System

• Android vs Qt - Pros and Cons

2011/8/22 2

Page 3: Layout Management - Android and Qt

Basic Concepts

2011/8/22 3

Page 4: Layout Management - Android and Qt

Layout & Layout Object

• Layout

– 名词 ——负责布局的对象

– 动词 ——进行布局(laid out)

• Layout Object

– 被布局的对象,由Layout来决定其位置(相对)和大小

• Layout Parameters

– 布局参数也可以分为Layout Object的参数和Layout本身的参数

2011/8/22 4

Page 5: Layout Management - Android and Qt

Cont.

• 常见的Layout

– BoxLayout(LinearLayout)

– BorderLayout

– FlowLayout

– StackedLayout

– GridLayout(TableLayout)

2011/8/22 5

Page 6: Layout Management - Android and Qt

Layout Procedure

• 布局通常是一个2-passes甚至multi-passes的过程

– Measure Pass:Layout需要询问从属的每一个Layout Object的期望的大小,可能包括最小,最佳,最大这几种尺寸,另外还可能包括是否允许通过增加高度交换较少的宽度以及之间的比例系数等

– Layout Pass:然后根据这些Layout Object期望的大小和布局参数(包括Layout Object的参数与自身的参数)来决定Layout Object最终的大小和位置

2011/8/22 6

Page 7: Layout Management - Android and Qt

Cont.

• 因为布局一般都支持嵌套,所以布局过程也包含一个向下递归的过程

– 父Layout询问子Layout Object期望的大小时,如果子Layout Object是一个Layout或者自身包含一个Layout,它需要先询问自己所属的Layout Object的期望大小

– 当父Layout决定了子Layout Object最终的大小时,如果子Layout Object是一个Layout或者自身包含一个Layout,它需要决定自己所属的Layout Object的最终的大小

2011/8/22 7

Page 8: Layout Management - Android and Qt

Why Layout?

• 避免大量手写的布局计算的代码,UI组件只需要定义自己期望的布局结构和参数即可

• 布局的修改更简单,只需要修改布局结构及参数

• 更容易适应组件大小的改变,手写的代码很难适应不同大小下的布局计算

• 跟UI编辑器结合,支持以可视化的方式构建UI界面

2011/8/22 8

Page 9: Layout Management - Android and Qt

Android Layout System

2011/8/22 9

Page 10: Layout Management - Android and Qt

Android UI Components Hierachy

2011/8/22 10

Page 11: Layout Management - Android and Qt

Cont.

• View objects are the basic units of user interface expression on the Android platform.

• The View class serves as the base for subclasses called "widgets," which offer fully implemented UI objects, like text fields and buttons.

• The ViewGroup class serves as the base for subclasses called "layouts," which offer different kinds of layout architecture, like linear, tabular and relative.

2011/8/22 11

Page 12: Layout Management - Android and Qt

Cont.

• View是所有UI组件的根类,它有两个重要的派生分支,Widgets和ViewGroup

• Widgets代表通用的简单类型UI组件,如Button,TextView等

• ViewGroup是所谓的容器类,用于容纳其它UI组件,ViewGroup也有两个重要的派生分支

– 通用的视图类,用于组织其它View,如ListView,GridView

– Layout用于布局管理

2011/8/22 12

Page 13: Layout Management - Android and Qt

Android Layout System Design

• Layout本身也是一个UI组件

• Layout Object只能是UI组件(派生自View),也就说只能对View派生的对象进行Layout

• 一个Layout布局结构的构建跟UI组件树的构建是一致的,Layout的嵌套实际上就是UI组件的嵌套

2011/8/22 13

Page 14: Layout Management - Android and Qt

Cont.

2011/8/22 14

Page 15: Layout Management - Android and Qt

Cont.

• 每一个Layout自身会包含一组属性,它是用于布局的参数

– LinearLayout::orientation

• 并且每一个Layout类下面会定义一个xxxLayoutParams类型,对应属于这个Layout的被Layout对象所应附带的布局参数(由View的getLayoutParams返回)

– ViewGroup::LayoutParams::width

– ViewGroup::LayoutParams::height

• View的measure方法被调用时(在Measure Pass中),需要计算自己期望的大小并告知Layout

2011/8/22 15

Page 16: Layout Management - Android and Qt

Qt Layout System Design

2011/8/22 16

Page 17: Layout Management - Android and Qt

Qt Layout System

2011/8/22 17

Page 18: Layout Management - Android and Qt

Cont.

• QWidget是Qt里面所有UI组件的基类,Qt没有单独的容器类,QWidget本身就可以容纳其它UI组件

• QLayout不是一个UI组件,而是从属于一个QWidget,也就是说QWidget包含一个QLayout来为它进行布局管理(策略模式)

• QLayoutItem是Qt里面Layout Object的基类,需要支持被布局的对象则需要派生自QLayoutItem

• QLayout本身也派生自QLayoutItem,从而支持嵌套布局

2011/8/22 18

Page 19: Layout Management - Android and Qt

Cont.

• QWidgetItem派生自QLayoutItem,然后指涉一个QWidget,它是QWidget的一个包裹类,用于对Qt Layout System能够对QWidget进行布局提供支持,QLayout通过QWidgetItem间接或者直接访问QWidget

• QLayoutItem还有其它用于辅助布局的派生类,比如QSpacerItem,用于占据一块空白区域

• QLayoutItem的属性用于提供Layout Object的Layout Parameters

• QLayout的属性用于提供Layout的Layout Parameters2011/8/22 19

Page 20: Layout Management - Android and Qt

Qt Layout System Design

• QLayout可以为任意派生自QLayoutItem的对象进行布局管理,并通过QWidgetItem这个包裹类对QWidget进行布局管理

• UI组件树跟布局管理的树结构是分开的,一棵UI组件树可以带有多个用于布局管理的树结构(数目由有多少个QWidget真正包含一个QLayout对象来决定)

• 组件树的层次结构和布局管理树的层次结构不需要一致

• 组件树和布局管理树之间需要进行状态同步和通讯

2011/8/22 20

Page 21: Layout Management - Android and Qt

Cont.

2011/8/22 21

Page 22: Layout Management - Android and Qt

Android - Pros and Cons

• Pros– 设计和实现的复杂度比较低

– 比较容易理解和使用

• Cons– 使用上不够灵活,不支持对非UI组件外的对象进行布局,无法在运行时动态改变布局

– 增加了UI树的复杂度,可能会引入一些多余的中间节点,导致渲染和事件路由的性能损耗

– 难以实现复杂的布局,布局越复杂会导致UI树越复杂

– 难以实现精确的布局控制

2011/8/22 22

Page 23: Layout Management - Android and Qt

Qt - Pros and Cons

• Pros– 使用上更灵活

– 构建复杂的布局更简单

– 精准的控制布局更容易

– 可以在拥有复杂布局的同时仍然让UI组件树保持一个简单的结构,不需要为了布局而引入多余的UI组件和额外的树层次,有利于提供渲染和事件路由的性能

– 动态改变某个UI组件分支的布局比较容易

• Cons– 设计和实现十分复杂– 布局管理系统和UI组件之间有紧密的耦合关系,需要在UI组件树和布局树之间进行状态同步和通信,需要大量的检查来保证其正确性

2011/8/22 23

Page 24: Layout Management - Android and Qt

The End

Thank you for your listeningYours Sincerely, Roger

2011/8/22 24