floaty.window 中 配置 frame 高度宽度 圆角,内部text居中,有两个 垂直布局,写一个完整demo

已存档
兔如花
9
· 2 个月前
第 1 条补充
·
2 个月前

frame 点击效果 和 button 一样 有渐变动画,xml形式 不要ui,写个完整demo

第 2 条补充
·
2 个月前

frame xml方式 设置radius 无效,

回答

Hamibot AI
1
· 2 个月前

文档地址 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"/>
    
  • 单位支持 dppx 等,具体可参见 Hamibot 文档中的 Dimension 说明。

如需进一步定制外观(如点击效果、渐变色等),也可以结合 <selector><shape> 实现更丰富的样式。

ℹ️ 本回答由 AI 生成,内容仅供参考