`
shappy1978
  • 浏览: 679482 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • J2ME
阅读更多

    由于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 running
					if (!transitionRunning) {
						
						// Key events
						if (!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 events
						if (!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 needed
						if (needToRevalidate) {
							forceRevalidate();
						}
						
					}
					
					// Repaint
					if (needToRepaint) {
						forceRepaint();
					}
				
				}
				
				return false;
			}

		};
     实际上要设定控件的固定宽度,最好是从widget的底层修改,增加fixWidth属性,在属性有赋值时强制固定大小,并且针对性的对于继承的控件。
分享到:
评论

相关推荐

    Qt界面 获取widget位置大小并与其他widget切换位置大小

    点击按钮实现不同widget间切换位置大小

    QT widget控件自适应窗口大小,修改比例

    QT widget控件自适应窗口大小,修改比例

    关于android AppWidget初探①

    关于android AppWidget初探① http://blog.csdn.net/zhq56030207/archive/2010/08/13/5809535.aspx#1631197

    widget 介绍:比较全面介绍widget由来的资料

    比较全面介绍widget由来的资料 Widget是一种小插件,通常以小窗或小框的形式出现在网页、系统桌面、手机等地方。Widget通常使用的是HTML、Javascript、Flash或者iframe方式嵌入。一个界面可以有多个widget,通过不同...

    Widget介绍.rar

    Widget由来、发展、用途、示例、开发 Widget是一种小插件,通常以小窗或小框的形式出现在网页、系统桌面、手机等地方。Widget通常使用的是HTML、Javascript、Flash或者iframe方式嵌入。一个界面可以有多个widget,...

    基于Android的Widget开发

    在设计之前,首先根据UI设计的原则,给出了合理的需求分析,确定了软件要实现的功能要求。然后根据功能要求,阐述了Widget的框架设计,包括桌面布局设计、实现Widget的生命周期方法、在Manifest文件中注册接收器...

    appWidget启动Activity

    使用appWidget启动一个Activity

    widget现状分析报告(移动widget)

    widget现状分析报告,分析当前widget的现状,并对运营商的widget提出建议

    比较全面介绍widget由来的资料

    Widget是一种小插件,通常以小窗或小框的形式出现在网页、系统桌面、手机等地方。Widget通常使用的是HTML、Javascript、Flash或者iframe方式嵌入。一个界面可以有多个widget,通过不同的widget可以在一个界面上分别...

    widget业务测试数据

    widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据

    Widget

    Widget

    andriod的一个桌面Widget 一个MP3播放器

    这是一个MP3程序,这个程序不仅仅带Activity,还有一个桌面Widget,同时是可以运行的源代码。可以通过桌面Widget控制后台音乐的播放,也可以点击Widget上面的LOGO进入应用程序。 涉及到了,一个基本的widget程序的大...

    SP Widget 软件使用手册

    SP Widget 软件使用手册 SP Widget 将提供 SILICON POWER 存储装置更多实用的软件功能,帮助您随时 能轻易地执行个人数据的备份加密。 有了 SP Widget,您将可使用 SILICON POWER 移动存储装置执行如下工作: 「我...

    Yahoo!Widget软件包

    Widget工具是由Yahoo!所推出的一款免费桌面应用程序平台,是一种运用了Javascript技术的开放源码平台,支持Windows和MacOS X操作系统。 Yahoo! Widget工具提供了数千种桌面迷你应用程序,这些在Yahoo! Widget工具...

    android widget入门教程

    widget入门教程 android widget

    Qt5以上动态添加子widget

    qt5 动态添加子widget

    android axure widget包

    自己从网上下载的PS做的axure的 widget ,发上来跟大家分享一下

    雅虎Widget制作全攻略

    制作widget的入门级别书目~可供参考~雅虎widget

    dcharts-widget

    dcharts-widget

    widget

    widget开发的大不分资料和工具 还有开发必备的东西,要好好品尝啊!

Global site tag (gtag.js) - Google Analytics