跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

触摸与反馈

在 CrossFly 中,当样式被标记为可按压时,对触摸的视觉响应(按钮的“下沉”)是自动的 — 你无需编写任何动画。

完整示例(复制、粘贴并运行)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;   // ComponentStyle

/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // 自动按压反馈:使用 .pressable() 的自定义样式
      Button botao = new Button("Enviar");
      botao.style(new ComponentStyle().backColor(0xFF0173ED).pressable());
      add(LAY_AUTO, botao);

      // 手动控制不透明度以表示状态(选中/禁用)
      Label item = new Label("Item");
      add(LAY_AUTO, item);
      boolean selecionado = false;
      item.alpha(selecionado ? 1f : 0.5f);
      Component.repaint();

      // 带反馈地切换状态:点击时将项目高亮恢复为不透明
      botao.onAction(c -> { item.alpha(1f); Component.repaint(); });
   }
}

下面的片段只展示了核心部分(放入 onShow() 内部的内容)。要运行它们,请将其放入上面的 MainWindow 骨架中。

自动按压反馈 — pressable()

将样式标记为 pressable(),组件在被触摸时便会自行播放动画(使用主题的 animationDuration):

Button b = new Button("Enviar");
b.style(Styles.button());   // Skin 的按钮样式已自带 .pressable()

// 在自定义样式中,显式启用:
b.style(new ComponentStyle().backColor(0xFF0173ED).pressable());

Skin 会从常态生成 pressed 状态(默认为更深的背景)。要自定义,请定义一个 pressedStyle(...)(参见 组件样式设置)。

反馈时长

来自 Styles.animationDuration(默认 0.3s),并由 Skin 的样式读取。全局调整:

Styles.animationDuration = 0.2f;   // 整个应用中更"干脆"的点击手感

手动控制不透明度 — alpha(...)

若要自行淡化/高亮某个组件(例如在视觉上禁用、突出选中),请使用 alpha(float) (0 = 透明,1 = 不透明):

item.alpha(selecionado ? 1f : 0.5f);
Component.repaint();

若要不透明度的平滑过渡,请与 AlphaAnimation 结合使用:

AlphaAnimation fade = new AlphaAnimation(item.alpha(), 1f, 0.2f);
fade.onUpdate(() -> { item.alpha(fade.getValue()); Component.repaint(); }).start();

最佳实践

  • 让 pressable() 负责触摸反馈 — 不要手动为按压做动画。
  • 用 alpha() 表示状态(禁用/选中);仅在过渡有增益时才做动画。
  • 被禁用的组件已通过样式的 disabledAlpha 淡化 — 不要重复处理。

常见错误

  • 自定义样式缺少 pressable() → 按钮触摸时没有反馈。
  • 设置 alpha(...) 却忘记 Component.repaint()(渲染是按需的)。

另请参阅

这个页面有帮助吗?