`

LayoutManager布局管理

 
阅读更多

不要设置figure的大小,而是应该在父中用setConstraint方法设置子的大小,

就像在swt里我们使用layout来控制各个控件的摆放位置一样,在Draw2D里最好也把这个工作交给LayoutManager来做。除非是在自己实现的Layout里,一般程序里自己不要轻易使用setBounds()、setLocation()和setSize()这些方法控制图形的位置和大小,而应该在为每个图形设置了适当的LayoutManager后,通过setConstraint()和setPreferredSize()等方法告诉layoutmanager如何布局。

 

 

在之前没有理解LayoutManager,如是就以一种尊重原著的心态,在实现一个复杂的编辑器布局的时候,拼命的用draw2d默认提供的布局进行拼凑,最终结果是代码的复杂度和耦合度急剧上升。

其实如果换一种思路,就是一个容器里面除了要显示的子,不应该为了布局而额外出现一些IFigure,就算出现也应该是尽量少的出现。当默认的布局不够用的时候,应该尝试自己扩展一个有效的LayoutManager。

 

这里顺便提一下SWT的局限性:SWT里面容器组件的布局跟容器组件是绑定的,也就是说,如果一个组件里面需要多种布局。它就必须有多个子,然后每个子里面再选择布局。如果从设计上布局就是一个没有形状只有规则的子,这样就显得更合理。

 

LayoutManager接口:布局管理器的基础接口,其中layout方法最为重要,在此次处实现布局的规则。另外invalidate起到一个清空的作用。

 

AbstractLayout:抽象实现。里面增加了两个属性:preferredSize容器的首选大小,isObservingVisibility我的理解这个属性描述的是,是否完全可见。这个类提供了一个抽象方法供其子实现,calculatePreferredSize(IFigure container,int wHint, int hHint)计算容器的大小,另外在setConstraint里面对子元素的位置信息进行清空,位置变了需要重新计算。

setConstraint(IFigure figure, Object constraint):方法中第二个参数是根据布局的需要来传入的,不一定是Rectangle

 

对于一个真实有效的布局管理器来说,它必须做两件事情:

1.一个就是根据一定的规则,算出整个容器的大小。如果大小不可以改变,那么就不能改变。

2.在Layout方法里面定义出一套规则来摆放它的子节点。

 

XYLayout:自由布局,绝对定位的布局。XY中有一个Map constraints保存了子的尺寸。如下是XYLayout实现布局的代码:

 

 

public void layout(IFigure parent) {
		Iterator children = parent.getChildren().iterator();
		Point offset = getOrigin(parent);
		IFigure f;
		while (children.hasNext()) {
			f = (IFigure) children.next();
			Rectangle bounds = (Rectangle) getConstraint(f);
			if (bounds == null)
				continue;

			if (bounds.width == -1 || bounds.height == -1) {
				Dimension preferredSize = f.getPreferredSize(bounds.width,
						bounds.height);
				bounds = bounds.getCopy();
				if (bounds.width == -1)
					bounds.width = preferredSize.width;
				if (bounds.height == -1)
					bounds.height = preferredSize.height;
			}
			bounds = bounds.getTranslated(offset);
			f.setBounds(bounds);
		}
	}
 

 

第一步它获取父的x,y坐标offset,然后计算每个子的矩形区域Rectangle,其中对超出边界的矩形做了一些处理。里面

句话没看明白:bounds = bounds.getCopy();没看懂。getConstraint中放的都是设置的Rectangle,而

getPreferredSize里面放的是首选矩形。

 

注意:这里的绝对定位是相对父容器来说的,而不是整个界面来说。

 

RulerLayout:继承自XYLayout,它是gef主要用来实现ZoomManager功能的时候自己扩展的,在gef中还有RulerFigure,RulerEditPart之类的,这个布局管理器并不通用。

 

public void layout(IFigure container) {
		List children = container.getChildren();
		Rectangle rulerSize = container.getClientArea();
		for (int i = 0; i < children.size(); i++) {
			IFigure child = (IFigure) children.get(i);
			Dimension childSize = child.getPreferredSize();
			int position = ((Integer) getConstraint(child)).intValue();
			if (((RulerFigure) container).isHorizontal()) {
				childSize.height = rulerSize.height - 1;
				Rectangle.SINGLETON.setLocation(position
						- (childSize.width / 2), rulerSize.y);
			} else {
				childSize.width = rulerSize.width - 1;
				Rectangle.SINGLETON.setLocation(rulerSize.x, position
						- (childSize.height / 2));
			}
			Rectangle.SINGLETON.setSize(childSize);
			child.setBounds(Rectangle.SINGLETON);
		}
	}
 

FreeformLayout:继承自XYLayout,它的布局方式跟XYLayout一样,只是重写了getOrigin(IFigure figure)方法,在获取Origin坐标的时候有所不同。

 

 

AbstractHintLayout:继承自AbstractLayout,它提供了一个calculateMinimumSize方法用于计算长度和宽度。AbstractHintLayout的子类都是尺寸敏感位置不敏感的相对布局。

 

 

还有好几种相对布局,暂时先不总结

BorderLayout:一个东南西北中的布局,里面有五个静态常量来描述位置。

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android-RecyclerView自定义LayoutManager

    在Android应用开发中,RecyclerView是一个强大的视图组件,它用于高效地展示大量数据集合,并且支持各种复杂的布局管理。本文将深入探讨如何自定义RecyclerView的LayoutManager,以满足特定的界面需求。 ...

    Java Swing - 常识篇 之 LayoutManager

    在Swing中,布局管理器(LayoutManager)扮演着至关重要的角色,它负责控制组件在容器中的排列方式和大小。本篇文章将深入探讨Java Swing中的布局管理器,以及如何有效地利用它们来构建用户界面。 首先,我们需要...

    一款基于Prototype 1.6 的web布局管理器

    标题中的“一款基于Prototype 1.6 的web布局管理器”指的是一个用于Web应用程序的布局解决方案,它构建在Prototype JavaScript库的1.6版本之上。Prototype是一个广泛使用的JavaScript框架,它提供了一系列工具来简化...

    前端项目-backbone.layoutmanager.zip

    布局管理器会自动处理视图的生命周期,包括渲染、事件绑定和销毁,避免了手动操作带来的复杂性和潜在错误。 **模板引擎集成**: LayoutManager 支持多种模板引擎,如 Handlebars、Mustache 和 EJS 等,允许开发者...

    LayoutManager

    标签中提到了“另类其它”,这可能意味着`LayoutManager`在这个特定项目中采用了非传统的布局策略或者定制的布局管理器。在Java中,除了内置的`FlowLayout`、`BorderLayout`、`GridLayout`和`CardLayout`等布局管理...

    Swing布局管理器

    Swing布局管理器是Java图形用户界面(GUI)开发中的一个重要概念,特别是在使用Swing库构建应用程序时。...同时,自定义布局管理器也是可能的,通过实现`LayoutManager`接口,可以创建符合特定需求的布局策略。

    窗口布局管理

    5. **布局管理器**:VC++中可以使用布局管理器(如文中提到的LayoutManager)来简化窗口布局的工作。布局管理器负责跟踪控件的位置和大小,并在窗口大小变化时自动调整它们。例如,LayoutManagerView.h和...

    自定义layoutManager优化

    在Android开发中,布局管理器(LayoutManager)是RecyclerView的核心组件之一,它负责处理视图的布局方式和滚动行为。自定义LayoutManager允许开发者根据特定需求定制布局的显示效果,从而实现各种复杂的视图展示。...

    Android-TurnLayoutManager用于RecyclerView的旋转木马布局管理器

    在Android开发中,布局管理器(LayoutManager)是RecyclerView的核心组件之一,它负责处理视图的排列方式和滚动行为。RecyclerView是一种高效、可复用的视图容器,常用于展示大量数据集。默认的布局管理器有线性布局...

    Android蜂巢布局管理器.zip

    HiveLayoutManager就是这样一个自定义布局管理器,它扩展了RecyclerView的LayoutManager接口,实现了自定义的滚动和布局策略。 `HiveLayoutManager-master`这个文件名可能指的是该布局管理器的源码仓库主分支。通过...

    Android-AndroidRecyclerView的深度定制的LayoutManager

    RecyclerView的核心在于其灵活性,开发者可以根据需求定制不同的布局管理器(LayoutManager),以实现各种复杂的列表布局效果。本篇文章将深入探讨如何为RecyclerView定制一个深度适配屏幕宽高比的网格布局Manager。...

    Java Swing - 常识篇 之 LayoutManager 03

    默认的布局管理器可能并不符合所有需求,因此,Swing提供了多种内置的LayoutManager类,如FlowLayout、BorderLayout、GridLayout、CardLayout以及 MigLayout 等,以满足不同场景下的布局需求。 1. FlowLayout:这是...

    Android-改造LayoutManager实现弧形滚动和中间放大的效果

    它是`RecyclerView`的核心组件,负责管理视图的布局和滚动行为。默认的`LinearLayoutManager`、`GridLayoutManager`和`StaggeredGridLayoutManager`分别对应线性、网格和瀑布流布局。但是,当系统提供的这些布局不能...

    VC布局管理器

    提供与Win32窗口句柄相关的界面的布局管理,可以兼容SDK、MFC、ATL等能获取窗口句柄的界面库。 模块只有一个头文件LayoutManager.h,移植非常方便。代码附带测试工程。 资源为原创作品,可以应用于任何产品,不收取...

    Java Swing - 常识篇 之 LayoutManager 02

    在Swing中,布局管理器(LayoutManager)扮演着至关重要的角色,它负责控制组件在容器中的排列方式和大小。本篇文章将深入探讨LayoutManager在Java Swing中的应用,以及如何有效地利用它们来构建用户界面。 首先,...

    自动换行LayoutManager

    1. **初始化布局管理器**: 在创建RecyclerView时,我们需要实例化我们的自定义LayoutManager。通常,我们会在Activity或Fragment的onCreate方法中完成此步骤: ```java RecyclerView recyclerView = findViewById(R...

    android v7兼容包RecyclerView的使用(一)——布局管理器

    自定义布局管理器需要实现`LayoutManager`接口,覆盖其中的方法,如`onLayoutChildren()`,这个方法负责实际的布局过程。 在使用RecyclerView时,我们需要进行以下基本步骤: 1. **添加依赖**:在build.gradle文件...

    Android代码-pager-layoutmanager

    具有分页功能的 Recyclerview 布局管理器,主打分页,可以替代部分场景下的网格布局,线性布局,以及一些简单的ViewPager,但也有一定的局限性,请选择性使用。 网格分页布局源码解析(上) 网格分页布局源码解析(下)...

    使用自定义 LayoutManager 实现 Android 中 Gallery 或者 ViewPager 控件的效果

    `RecyclerView`是Android框架中用于展示可滚动列表的一个高效组件,它通过`Adapter`来填充数据,`LayoutManager`来决定视图如何布局和滚动。与`ListView`相比,`RecyclerView`具有更好的性能和更多的定制选项。 ...

    自定义LayoutManager

    在Android开发中,布局管理器(LayoutManager)是RecyclerView的核心组件之一,它负责控制视图项在屏幕上的排列和滚动方式。本教程将深入探讨如何创建自定义LayoutManager,以实现个性化和创新的界面效果。 首先,...

Global site tag (gtag.js) - Google Analytics