【问题标题】:Sony Smartwatch - dynamically change layout (paddingLeft)Sony Smartwatch - 动态改变布局 (paddingLeft)
【发布时间】:2025-12-01 11:40:02
【问题描述】:

我想在手表上实现一个运行文本,这样一行文本就会从右向左移动。

对我来说最好的方法是创建一个具有屏幕宽度的 TextView,将文本设置为最大 paddingLeft,然后减少填充,以便文本(几个字)从从右到左。

所以我的问题是:是否可以动态更改 TextView 的属性“paddingLeft”?

<TextView
    android:id="@+id/scrollingText"
    android:layout_width="@dimen/smart_watch_2_control_width"
    android:layout_height="wrap_content"

    android:paddingRight="@dimen/smart_watch_2_control_width"

    android:text="Hello world!"

    />

可能是这样的:

Intent intent = new Intent(Control.Intents.CONTROL_SEND_LAYOUT_INTENT);
intent.putExtra(Control.Intents.EXTRA_LAYOUT_REFERENCE, layoutReference);
intent.putExtra(Control.Intents.EXTRA_PADDING_LEFT, paddingLeft);
controlExtension.sendToHostApp(intent);

我很清楚,Control.Intents 中既没有 CONTROL_SEND_LAYOUT_INTENT 也没有 EXTRA_PADDING_LEFT,而且事实上,可以使用 CONTROL_PROCESS_LAYOUT_INTENT 完成类似的操作,但文档中有一条注释:

Note that the extension must always send a layout covering the full screen according to the display screen size. This means that even though the extension wants to update a portion of the screen a full screen layout must be supplied anyway.

所以在我的情况下,我需要创建 220 个相等的 xml 文件,唯一的区别是 paddingLeft 设置为 220、219、218 等,并且每次都设置正确的布局? 这听起来不适合我:-)

另一种解决方法是使用 ImageView 而不是 TextView 并且每次在 Host 上将文本转换为 Bitmap 并通过“setImage”将更新发送到 Watch,实际上我已经实现了这种方式,但它是并不是真正的高性能解决方案...

我也想过发送前面有空格的文本,比如:

  1. “___Hello_world!”
  2. “__Hello_world!”
  3. “_Hello_world!”

但我希望移动的粒度更大。

那么有人对如何更改“paddingLeft”有任何想法吗?

【问题讨论】:

  • 如果需要传递 XML 来构建布局,您始终可以在代码中动态“更改”XML。当然,如果尝试做一个标记或幻灯片,这可能不是一个好方法..
  • 据我所知,您只能通过 Control.Intents.EXTRA_DATA_XML_LAYOUT 发送 R.layout.layoutID。请告诉我,如何更改xml?
  • 我可以这样做:LayoutInflater inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(layoutID, null); ControlViewGroup mLayout = (ControlViewGroup) parseLayout(layout); ControlView scrollingText = mLayout.findViewById(R.id.scrollingText);com.sonyericsson.extras.liveware.extension.util.control.ControlView 中没有“更改”功能
  • 抱歉,我以为您可以使用我在 controlextension 的 onstart/onresume 中发布的代码,但我一定错过了理解 sdk。
  • Oleg,你写:“请注意,扩展程序必须始终根据显示屏幕大小发送覆盖全屏的布局。这意味着即使扩展程序想要更新屏幕的一部分无论如何都必须提供全屏布局。”这不是 100% 正确的,我会详细介绍您在此处提出的另一个问题:*.com/questions/19402631/…

标签: android sony sony-smartwatch


【解决方案1】:

这是实现所谓的动画的一种相当奇怪的方式,并且在 Sony SmartWatch SDK 的文档中已经有一个示例。

附加编辑: 在 SmartWatch 上无法实现流畅的动画效果,因为你不控制屏幕,只是周期性地发送要显示在屏幕上的数据,通过 Intent 发送。所以很明显为什么你不能达到任何平滑,“刷新率”太低了。

再次重申:您可以获得的最佳动画是在文档中实现的,请参阅 SimpleControl 应用程序,这是任何人都应该在该文档中看到的第一件事。

【讨论】:

  • 这是一个答案吗? :-) 在示例中 - 图像被组合到动画中。我需要的是每 100 毫秒将文本“移动”到 1 像素。我可以通过在位图的画布上绘制带有偏移量的文本来做到这一点,这将通过蓝牙从主机发送到手表,但在这种情况下性能非常糟糕。文本的运动看起来很迟钝,一点也不流畅。
  • Да,我会告诉你为什么它是一个答案: 1) 它让你清楚你想要实现的东西叫做动画,并指出在哪里可以找到一个示例实现。 2)它让你偏离了你试图遵循的错误道路。你有没有按照你提议的方式,通过逐渐修改布局属性来制作动画?我不这么认为,即使你这样做了,你也没有机会完成一个流畅的动画。我会用我想说的其余部分来补充我的答案。
  • 感谢您对我的问题感兴趣!修改布局属性的示例来自早期的 HTML 实践,例如 here