B4X控件的尺寸大小属性(宽度/高度属性)是指Width /Height属性(B4J中还有PrefWidth / PrefHeight属性)。
1、Width
设置或获取控件的宽度。
用法示例:
设置控件Label1的宽度:Label1.Width=200 或 Label1.Width=Label1.Width+50
获取控件Label1的宽度:Dim w as Float=Label1.Width
备注:
Width属性的值通常以像素为单位(B4A中一般以dip为单位)。某些控件可能有一个最小宽度,设置小于这个值的宽度可能会导致不可预见的行为。
Width属性在B4J中对于大部分控件是只读的,只读属性下要设置控件宽度请用如下方法:
Label1.As(B4XView).Width=200
或Label1.PrefWidth=200
2、Height
设置或获取控件的高度。
用法示例:
设置控件Label1的高度:Label1.Height=50 或 Label1.Height=Label1.Height+10
获取控件Label1的高度:Dim h as float=Label1.Height
备注:
Height属性的值通常以像素为单位(B4A中一般以dip为单位)。某些控件可能有一个最小高度,设置小于这个值可能会导致不可预见的行为。
Height属性在B4J中对于大部分控件是只读的,只读属性下要设置控件宽度请用如下方法:
Label1.As(B4XView).Height=50
或Label1.PrefHeight=50
3、PrefWidth / PrefHeight(仅限B4J)
设置或获取控件的预定义宽度/高度
用法示例:
设置控件Label1的预定义宽度/高度:
Label1.PrefWidth=200 或 Label1.PrefWidth=Label1.PrefWidth+50
Label1.PrefHeight=50 或 Label1.PrefHeight=Label1.PrefHeight+10
获取控件Label1的预定义宽度/高度:
Dim w as Float=Label1.PrefWidth
Dim h as float=Label1.PrefHeight
其实,Label1.As(B4XView).Height=50相当于Label1.PrefHeight=50
在B4J中多了两个尺寸属性PrefWidth / PrefHeight,而且B4J中Width /Height属性是只读的。我们在调整控件尺寸的时候到底使用Width /Height还是PrefWidth / PrefHeight呢?让我们通过下面的示例感受一下不同:
我们新建一个B4XPages项目,在项目模板的主页面布局中已有一个Button1按钮,在布局管理器中看到Button1的宽度是100,高度是60。我们打开B4XMainPage模块添加如下代码:
①在Sub Class_Globals例程添加:
Private Button1 As Button
②在Sub B4XPage_Created例程添加:
Log("B4XPage_Created例程中的宽度:"&Button1.Width)
Log("B4XPage_Created例程中的预定义宽度:"&Button1.PrefWidth)
③在Sub Button1_Click例程注释掉原代码,添加:
Button1.PrefWidth=200
Log("Click事件中的宽度:"&Button1.Width)
Log("Click事件中的预定义宽度:"&Button1.PrefWidth)
④添加Sub Button1_Resize例程,并添加代码:
Log("Resize事件中的宽度:"&Button1.Width)
Log("Resize事件中的预定义宽度:"&Button1.PrefWidth)
这样,整个B4XMainPage模块的代码如下:
Sub Class_Globals
Private Root As B4XView
Private xui As XUI
Private Button1 As Button
End Sub
Public Sub Initialize
' B4XPages.GetManager.LogEvents = True
End Sub
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("MainPage")
Log("B4XPage_Created例程中的宽度:"&Button1.Width)
Log("B4XPage_Created例程中的预定义宽度:"&Button1.PrefWidth)
End Sub
Private Sub Button1_Click
' xui.MsgboxAsync("Hello world!", "B4X")
Button1.PrefWidth=200
Log("Click事件中的宽度:"&Button1.Width)
Log("Click事件中的预定义宽度:"&Button1.PrefWidth)
End Sub
Private Sub Button1_Resize (Width As Double, Height As Double)
Log("Resize事件中的宽度:"&Button1.Width)
Log("Resize事件中的预定义宽度:"&Button1.PrefWidth)
End Sub
存盘后调试运行,日志记录如下图:
从日志记录可以看出:项目启动时调用了一次 Button1_Resize 例程,该例程获取了Button1的原定义尺寸;但B4XPage_Created例程在Button1_Resize例程之前运行,运行时还没有完成Button1的加载,没有获取到Button1的实际尺寸,仅获取到预定义尺寸。
点击Button1按钮,得到如下日志记录:
点击Button1按钮后,Button1的宽度发生了变化。从日志记录看出:点击按钮也调用了一次Button1_Resize事件。点击按钮时执行了Button1.PrefWidth=200语句,但此时Button1_Resize事件还没有完成,Click事件仅获取了新的预定义宽度,而获取的Button1实际宽度还是之前的。
总结:
B4J的UI操作通常需要在UI线程中执行。控件的初始化顺序一般晚于AppStart例程和B4XPage_Created例程。控件的大小和位置通常在UI初始化完成后才能被正确设置。
在B4J中调整和获取控件大小不应在AppStart例程和B4XPage_Created例程,而应在Resize例程。
在B4J中需要调整大小和外观的控件最好定义为B4XView类型,如果确实不想定义为B4XView类型,最好使用PrefWidth / PrefHeight调整或获取大小数据。
B4XView类型的控件可直接使用Width /Height属性(没有PrefWidth / PrefHeight属性)调整或获取大小数据,即使在AppStart例程和B4XPage_Created例程也能正确完成相关操作。