首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

关于Kuix怎么确定Widget的大小探讨

2012-09-29 
关于Kuix如何确定Widget的大小探讨?? ?由于Kuix作者设计理念的影响,所有的widget宽度都是自动增长的,除非

关于Kuix如何确定Widget的大小探讨

?? ?由于Kuix作者设计理念的影响,所有的widget宽度都是自动增长的,除非它的宽度超过屏幕的宽度,实际上这种做法和一般设计时设定控件宽度的模式格格不入,而且经常性的,会出现输入框(textfield)超出屏幕边界的恶性效果,本文旨在讨论widget的长度是如何控制的,什么时候系统会自动计算窗口的布局情况。

?? ?widget虽然后width属性,但是它是不可以赋值的,这一点在修改TextArea中文断行时一直对它颇为迷惑。实际上直接查找Widget的width什么时候被修改是有些困难的,setBounds函数似乎是有这个效果,而且是共用的,实际上它只在Desktop中被调用,用于设置窗口或者说系统屏幕的大小。实际上所有控件的大小都是基于其中所包含的子控件的大小,而最终都基于Text的width,实际上Text的width则是在getPreferredSize计算出来,调用顺序为,需要刷新时,执行layou.dolayout>measure>getPreferredSize,当然不同的layout具体计算位置的算法有所不同。

/* (non-Javadoc) * @see org.kalmeo.kuix.widget.Widget#getPreferredSize(int) */public Metrics getPreferredSize(int preferredWidth) {Metrics metrics;if (needToComputePreferredSize(preferredWidth)) {metrics = super.getPreferredSize(preferredWidth);String text = getText();Font font = getFont();if (font != null) {if (text != null) {metrics.width += font.stringWidth(text);} else {metrics.width += font.charWidth(' ');}metrics.height += font.getHeight();}} else {metrics = getCachedMetrics();}return metrics;}

??? ?当某个widget修改大小或者包含widget时,比如,text.setText,执行顺序如下settext>invalidate>parent.invalidate,逐级向上调用invalidate直到Desktop,调用KuixCanvas.revalidateNextFrame,读过《关于Kuix的窗口刷新机制》可以知道,此时会等待worker线程执行forceRevalidate>desktop.revalidate()>doLayout进行重新计算布局,进而调用forceRepaint重绘窗口

public boolean run() {if (needToChangeSize) {forceSizeChanged(desiredWidth, desiredHeight);}if (sizeInitialized) {// Key events, Pointer events and revalidation are execute only if transition is not runningif (!transitionRunning) {// Key eventsif (!keyEvents.isEmpty()) {synchronized (this) {for (int i = 0; i < keyEvents.size(); ++i) {int[] keyEvent = ((int[]) keyEvents.elementAt(i));FocusManager focusManager = desktop.getCurrentFocusManager();if (focusManager != null && focusManager.processKeyEvent((byte) keyEvent[0], keyEvent[1])) {repaintNextFrame();}}}keyEvents.removeAllElements();}// Pointer eventsif (!pointerEvents.isEmpty()) {synchronized (this) {for (int i = 0; i < pointerEvents.size(); ++i) {int[] pointerEvent = ((int[]) pointerEvents.elementAt(i));FocusManager focusManager = desktop.getCurrentFocusManager();if (focusManager != null && focusManager.processPointerEvent((byte) pointerEvent[0], pointerEvent[1], pointerEvent[2])) {repaintNextFrame();} else if ((byte) pointerEvent[0] == KuixConstants.POINTER_DROPPED_EVENT_TYPE) {if (desktop.getDraggedWidget() != null) {desktop.removeDraggedWidget(true);}}}}pointerEvents.removeAllElements();}// Revalidate if neededif (needToRevalidate) {forceRevalidate();}}// Repaintif (needToRepaint) {forceRepaint();}}return false;}};
??? ?实际上要设定控件的固定宽度,最好是从widget的底层修改,增加fixWidth属性,在属性有赋值时强制固定大小,并且针对性的对于继承的控件。

热点排行