`
shappy1978
  • 浏览: 700287 次
  • 性别: 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切换位置大小

    "Qt界面获取Widget位置大小并与其他Widget切换位置大小"这个主题涉及到如何动态地改变和管理Widget的位置和尺寸,以及如何通过交互来实现它们之间的切换。在VS2013环境下开发Qt应用时,这些操作对于创建灵活、响应式...

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

    本文将详细讲解如何实现QT Widget控件的自适应窗口大小以及调整其比例。 首先,我们需要了解QT中的布局管理器(Layout Manager),如QVBoxLayout、QHBoxLayout和QGridLayout等。这些布局管理器可以帮助我们自动调整...

    关于android AppWidget初探①

    在本文中,我们将深入探讨AppWidget的基本概念、工作原理以及如何创建一个简单的AppWidget。 1. **AppWidget的基本概念** - AppWidget并非独立的应用程序,而是主应用的一部分,通过`AppWidgetProvider`类与宿主...

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

    本报告旨在分析当前移动Widget的市场状况,探讨其起源和发展历程,以及典型成功案例,为运营商提供策略建议。 【详细内容】: 1. **Widget定义及特点** Widget是一种基于HTML、JavaScript、Flash或iframe的小工具...

    android Launcher添加widget源码

    本篇将深入探讨如何在自定义的Launcher中添加Widget,并通过源码分析来理解这一过程。 首先,我们来看“android Launcher添加widget”的核心概念。在Android中,Widget是一种轻量级的应用组件,可以在用户的主屏幕...

    appWidget启动Activity

    本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`appWidget`的基本构成。一个`appWidget`通常包含一个或多个`RemoteViews`,它们是显示在主屏幕上的视图组件。`RemoteViews`允许...

    android appwidget全面解析

    在深入探讨Android AppWidget之前,我们首先需要理解AppWidget在Android生态中的角色和价值。AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可...

    Qt5以上动态添加子widget

    本文将深入探讨如何在Qt5及更高版本中动态地向父Widget添加子Widget,以及相关的C++编程技巧。 首先,我们来了解Qt中的Widget。Widget是Qt GUI系统的基础,它代表了屏幕上可见的任何元素,如按钮、文本框等。在Qt中...

    Widget工具制作教程

    本教程将深入探讨如何制作Widget工具,涉及的关键知识点包括开发环境搭建、编程语言选择、设计原则以及发布流程。 一、开发工具选择 制作Widget工具首先需要合适的开发工具。对于桌面Widget,可能需要如Adobe Air...

    widget

    1. **需求分析**: 确定Widget的功能、目标用户和使用场景。 2. **设计阶段**: 设计Widget的UI界面,包括布局、颜色、字体等元素,并制定交互逻辑。 3. **编程实现**: 使用合适的编程语言(如Java、Swift或Kotlin)...

    android 桌面小窗口 widget demo

    在本篇内容中,我们将深入探讨如何创建一个Android桌面小窗口Widget,并通过"android 桌面小窗口 widget demo"来实践。 首先,我们需要了解Android Widget的基本组成和工作原理。Widget主要由以下几部分构成: 1. ...

    android widget

    - **Widget大小**:在布局文件中,我们可以通过定义`&lt;appwidget-provider&gt;`标签的`minWidth`和`minHeight`属性来设定Widget的最小尺寸。 - **点击事件处理**:可以为Widget中的View元素设置点击事件,通常通过...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...

    一个简单的qt程序设置QWidget大小

    本文将深入探讨如何在Qt中设置`QWidget`的大小,以及相关的布局管理。 首先,`QWidget`类提供了几个方法来控制其大小: 1. `setGeometry(int x, int y, int width, int height)`: 这个方法允许我们直接设置`...

    Android Widget组件开发

    本篇文章将深入探讨Android中的Widget组件,包括ConfigWidget、ServiceWidget和SimpleWidget。 首先,我们来看ConfigWidget。ConfigWidget通常指的是配置Widget,它允许用户自定义Widget的某些属性或设置。例如,...

    brew widget开发源代码

    下面我们将详细探讨Brew Widget及其开发中的关键知识点。 首先,我们需要理解Brew Widget是什么。Brew Widget可能是指一个自定义的小部件库,它扩展了原生平台的UI元素,使开发者能够快速构建具有独特交互和视觉...

    Android Widget示例

    让我们深入探讨一下Android Widget的相关知识点。 1. **Widget基础**: - Android Widget是Android操作系统提供的桌面组件,可以是时钟、天气预报、音乐播放控制等,它们在主屏幕上提供直观、便捷的交互。 - ...

    AndroidWidget开发学习教程.pdf

    `meta-data`标签则用来指定Widget的元数据,通常包含在`res/xml`目录下的一个XML文件,这个文件包含了关于Widget的更多详细信息。 3. **编写XML provider文件**: 这个XML文件(如`info.xml`)定义了Widget的大小...

    android之appwidget(四)终 appwidget控件更新

    本文将深入探讨Android AppWidget的第四部分,主要关注如何更新AppWidget中的控件,以及相关的源码和工具。 **一、AppWidget更新机制** 1. **AppWidgetProvider**: 这是所有AppWidget的核心组件,它是一个...

    Qt StackWidget切换动画!

    在本文中,我们将深入探讨如何在Qt环境中使用StackWidget实现优雅的页面切换动画,从而提升应用的用户体验。StackWidget是Qt提供的一种方便的容器控件,用于管理多个子窗口或Widget,并在它们之间进行平滑的过渡。让...

Global site tag (gtag.js) - Google Analytics