floaty.window 中 配置 frame 高度宽度 圆角,内部text居中,有两个 垂直布局,写一个完整demo
frame 点击效果 和 button 一样 有渐变动画,xml形式 不要ui,写个完整demo
frame xml方式 设置radius 无效,
回答
文档地址 https://docs.hamibot.com/
以下是一个完整示例,演示如何在 floaty.window
中配置一个带有圆角的 frame
,并设置其宽度和高度,内部实现两个垂直布局,并让文本居中显示。
// 创建悬浮窗
var window = floaty.window(
<frame bg="#FFD700" w="250" h="300" radius="20">
<vertical padding="16">
<!-- 第一个垂直布局 -->
<text id="titleText" textSize="18sp" textColor="#000000" gravity="center">标题文字</text>
<!-- 第二个垂直布局 -->
<vertical margin="10" bg="#FFFFFF" gravity="center" w="*" h="*">
<text id="contentText1" textSize="16sp" textColor="#333333">内容区域 1</text>
<text id="contentText2" textSize="16sp" textColor="#333333" margin="10 0">内容区域 2</text>
</vertical>
</vertical>
</frame>
);
// 设置悬浮窗位置(可选)
window.setPosition(100, 200);
// 在UI线程中修改文本内容
ui.run(function () {
window.titleText.setText("这是一个标题");
window.contentText1.setText("这是内容部分的第一行");
window.contentText2.setText("这是内容部分的第二行");
});
// 5秒后关闭悬浮窗
setTimeout(function () {
window.close();
}, 5000);
功能说明:
- 外层
frame
:设置了背景颜色bg="#FFD700"
(金色),宽度w="250"
,高度h="300"
,以及圆角radius="20"
。 - 第一层垂直布局
vertical
:用于包裹整个内容,添加了内边距padding="16"
。 - 第一个文本控件
text
:居中显示标题文字,并通过gravity="center"
实现居中对齐。 - 第二个垂直布局
vertical
:用来放置两段内容文本,背景色为白色bg="#FFFFFF"
,并通过gravity="center"
居中对齐其中的内容。 ui.run
函数:确保在 UI 线程中更新文本内容。setTimeout
函数:5 秒后关闭悬浮窗。
你可以根据需要进一步自定义样式和布局。
补充回答 1
文档地址 https://docs.hamibot.com/
要在 frame
上实现类似 button
的点击效果(如渐变动画),你可以使用 Android 的选择器(XML State List)来定义背景,并将其作为 frame
的背景。以下是一个完整的示例,展示如何通过 XML 实现带有点击动画的 frame
。
完整代码如下:
// 创建悬浮窗并设置带点击效果的 frame 布局
var window = floaty.window(
<frame bg="{{R.drawable.clickable_frame}}" w="200" h="100">
<text id="txt" text="点击我" textSize="18sp" gravity="center" textColor="#FFFFFF"/>
</frame>
);
// 模拟点击事件
window.frame.setOnClickListener(function () {
toast("Frame 被点击了");
});
重点说明:
1. 背景资源定义(选择器)
你需要在脚本中动态创建一个选择器样式,模拟按钮的点击动画效果。虽然不能直接写多个 XML 文件,但可以通过 ui.inflate
构建一个带有状态变化的颜色选择器。
以下是完整的内联方式实现:
// 使用 ui.inflate 动态创建点击效果
var selectorDrawable = ui.inflate(
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#FF8800"/>
<corners android:radius="10dp"/>
</shape>
</item>
<item>
<shape>
<solid android:color="#FFAA00"/>
<corners android:radius="10dp"/>
</shape>
</item>
</selector>
);
// 设置 frame 背景为动态生成的选择器
window.frame.setBackground(selectorDrawable);
2. 完整可运行脚本:
// 创建悬浮窗
var window = floaty.window(
<frame id="clickFrame" w="200" h="100" padding="16" gravity="center">
<text id="txt" text="点击我" textSize="18sp" textColor="#FFFFFF" gravity="center"/>
</frame>
);
// 动态创建点击效果背景
var selectorDrawable = ui.inflate(
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="#FF8800"/>
<corners android:radius="10dp"/>
</shape>
</item>
<item>
<shape>
<solid android:color="#FFAA00"/>
<corners android:radius="10dp"/>
</shape>
</item>
</selector>
);
// 设置背景和点击监听
window.clickFrame.setBackground(selectorDrawable);
window.clickFrame.setOnClickListener(function () {
toast("Frame 被点击了");
});
效果描述:
- 点击时颜色会从
#FFAA00
变成#FF8800
,模拟出类似按钮的点击反馈动画。 frame
尺寸固定为200x100
,内部文本居中显示。- 不依赖外部 XML 文件,所有资源都在脚本中动态构建。
你也可以根据需要调整圆角、颜色等属性来匹配你的 UI 风格。
补充回答 2
如果你在 XML 中使用 radius
属性设置圆角无效,通常是因为布局或背景的渲染方式导致属性未被正确识别。以下是可能的原因和解决方法。
✅ 解决方案:使用 <shape>
定义背景并设置圆角
在 Hamibot 的 UI 模块中,直接对 frame
使用 radius
属性有时无法生效。要实现圆角效果,推荐通过自定义背景来完成。
✅ 示例代码(有效实现圆角):
// 创建悬浮窗
var window = floaty.window(
<frame id="roundedFrame" w="200" h="100" padding="16" gravity="center">
<text text="圆角 Frame" textSize="18sp" textColor="#FFFFFF" gravity="center"/>
</frame>
);
// 动态创建带圆角的背景
var backgroundDrawable = ui.inflate(
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFAA00"/>
<corners android:radius="20dp"/>
</shape>
);
// 设置背景
window.roundedFrame.setBackground(backgroundDrawable);
🧩 原因分析
radius
是 Hamibot 扩展属性,并非原生 Android 支持的标准属性。- 当你使用默认背景时,
radius
可能不会生效,特别是在某些布局嵌套或动态修改背景的情况下。 - 推荐始终使用
<shape>
定义背景样式,这样可以保证兼容性和一致性。
💡 小贴士
- 如果你需要分别设置四个角的半径,可以使用:
<corners android:topLeft="10dp" android:topRight="20dp" android:bottomLeft="30dp" android:bottomRight="40dp"/>
- 单位支持
dp
、px
等,具体可参见 Hamibot 文档中的 Dimension 说明。
如需进一步定制外观(如点击效果、渐变色等),也可以结合 <selector>
和 <shape>
实现更丰富的样式。