【鸿蒙实战开发】长按组件颜色刷新

需求描述

实现一个工具,可以帮助我们实现根据触摸时间来动态更新当前的颜色

原理讲解

ARGB

ARGB颜色字符串是一种用于表示颜色的编码方式,它结合了RGB色彩模式与Alpha(透明度)通道。

ARGB颜色字符串由四个部分组成,分别代表Alpha(透明度)、Red(红色)、Green(绿色)、Blue(蓝色)四个通道的值。每个通道的值通常用十六进制数表示,范围从00到FF(十六进制),对应于十进制中的0到255。因此,一个完整的ARGB颜色字符串看起来像这样:#AARRGGBB,其中AA是Alpha值,RR是红色值,GG是绿色值,BB是蓝色值。

渐变

在渐变中,A、R、G、B四个颜色通道的值会沿着渐变方向逐渐变化。例如,从红色(R:255, G:0, B:0)渐变到蓝色(R:0, G:0, B:255),则红色通道的值会逐渐减小,而蓝色通道的值会逐渐增加,绿色通道的值可能保持不变(取决于中间是否有绿色过渡)。

实现思路

  1. 定义起始和结束颜色:确定用户在未长按时的颜色(起始颜色)和长按时想要达到的颜色(结束颜色),长按到达结束颜色的时间。
  2. 颜色解析:将起始颜色 和 结束颜色相应的ARGB值进行重新解码,得到每个通道单独的ARGB值。
  3. 颜色线性插值计算:根据时间的变化,在两个指定的颜色之间平滑过渡。它首先计算了从某个起始时间到当前时间的差值,并将这个差值限制在一个指定的时间间隔内。然后,它使用线性插值方法来计算当前时间下应该显示的颜色的各个颜色通道(红、绿、蓝、透明度)的值。这些值可以用来在图形界面上动态地改变元素的颜色。
  4. 颜色编码:将拿到的十进制ARGB值重新编码成十六进制。
  5. 触摸事件:抓取触摸事件的按下和抬起事件,将记录手指触摸组件的时间点和手指离开组件的时间点。用来给颜色计算。并且定时刷新颜色

实现源码

1.定义起始和结束颜色:

  // 开始颜色
  startColor = "#ffff0000"
  // 结束颜色
  endColor = "#ff00ff00"
  // 最大长按时间
  timeInterval = 4000;

  constructor();
  constructor(startColor: string, endColor: string, timeInterval: number);
  constructor(startColor?: string, endColor?: string, timeInterval?: number) {
    if (startColor && endColor && timeInterval) {
      this.startColor = startColor;
      this.endColor = endColor;
      this.timeInterval = t
HarmonyOS实战开发中,卡片定时刷新和定点刷新有以下方法: - **定时刷新方法**:定时刷新有配额限制,每张卡片每天最多通过定时方式触发刷新50次,刷新次数会在每天的0点重置。定时刷新包含卡片配置项`updateDuration`和调用`setFormNextRefreshTime()`方法两种方式。当达到50次配额后,无法通过定时方式再次触发刷新[^1]。 - **系统API刷新方法**:`requestForm()`是系统更新卡片的API,一般用于定时、定点刷新卡片,不过此方法仅对系统应用开放[^2]。 - **主动触发更新方法**:当卡片应用需要更新数据(如触发了定时更新或定点更新)时,卡片应用获取最新数据,并调用`updateForm()`接口主动触发卡片的更新。若卡片支持定时更新、定点更新或卡片使用方主动请求更新功能,则提供方需要重写`onUpdate(formId: string)`方法以支持数据更新。示例代码如下: ```typescript onUpdate(formId: string) { console.info('FormAbility onUpdate'); let obj: Record<string, string> = { "title": "titleOnUpdate", "detail": "detailOnUpdate" }; let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj); formProvider.updateForm(formId, formData).catch((error: Error) => { console.info('FormAbility updateForm, error:' + JSON.stringify(error)); }); } ``` 上述代码中,`onUpdate`方法会在需要更新卡片时被调用,创建了包含更新数据的`formData`对象,并调用`formProvider.updateForm`方法去更新对应的卡片,仅更新入参中携带的数据信息,其他信息保持不变[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值