首页 > 其他分享 >鸿蒙应用示例:ArkTS中设置颜色透明度与颜色渐变方案探讨

鸿蒙应用示例:ArkTS中设置颜色透明度与颜色渐变方案探讨

时间:2024-10-04 20:49:55浏览次数:3  
标签:十六进制 ArkTS ratio 示例 let backgroundColor 颜色 255

鸿蒙应用示例:ArkTS中设置颜色透明度与颜色渐变方案探讨_鸿蒙

/**
 * 根据比例混合两个十六进制颜色值。
 * @param colorA 第一个颜色的十六进制值,例如红色 '#ff0000'。
 * @param colorB 第二个颜色的十六进制值,例如黑色 '#000000'。
 * @param ratio 混合比例,0 表示仅返回 colorA,1 表示仅返回 colorB,介于 0 和 1 之间的值会混合两个颜色。
 * @returns 混合后的颜色的十六进制值。
 */
function mixColors(colorA: string, colorB: string, ratio: number): string {
  let mix = (a: number, b: number, ratio: number) => Math.round(a + (b - a) * ratio).toString(16).padStart(2, '0');
  let a = parseInt(colorA.slice(1), 16);
  let b = parseInt(colorB.slice(1), 16);
  let red = mix((a >> 16) & 255, (b >> 16) & 255, ratio);
  let green = mix((a >> 8) & 255, (b >> 8) & 255, ratio);
  let blue = mix(a & 255, b & 255, ratio);
  return `#${red}${green}${blue}`;
}

function convertDecimalColorToHex(decimalColorValue: number): string {
  if (decimalColorValue < 0 || decimalColorValue > 0xFFFFFFFF) {
    throw new Error('Color value must be within the range of 0 to 0xFFFFFFFF.');
  }

  const paddedHexColor = ('00000000' + decimalColorValue.toString(16).toUpperCase()).slice(-8);
  return '#' + paddedHexColor.slice(-6);
}

@Entry
@Component
struct Index {
  @State resourceColor: Resource | undefined = undefined
  @State convertedColorHex: string = ""
  @State displayText: string = "测试测试"

  aboutToAppear(): void {
    this.resourceColor = $r(`app.color.start_window_background`);
    const colorFromResourceManager = getContext(this).resourceManager.getColorByNameSync('start_window_background');
    console.info('从ResourceManager获取的颜色(十进制):', colorFromResourceManager);
    this.convertedColorHex = convertDecimalColorToHex(colorFromResourceManager);
    console.info('转换后的十六进制颜色:', this.convertedColorHex);
  }

  build() {
    Column() {
      Text('测试1').backgroundColor('rgba(0, 0, 0, 0.5)')

      Text('测试2').backgroundColor('#80000000')

      Text(mixColors('#ff0000', '#000000', 0))
        .fontColor(Color.White)
        .backgroundColor(mixColors('#ff0000', '#000000', 0))
      Text(mixColors('#ff0000', '#000000', 1))
        .fontColor(Color.White)
        .backgroundColor(mixColors('#ff0000', '#000000', 1))
      Text(mixColors('#ff0000', '#000000', 0.5))
        .fontColor(Color.White)
        .backgroundColor(mixColors('#ff0000', '#000000', 0.5))
      Text(mixColors('#ff0000', '#000000', 0.8))
        .fontColor(Color.White)
        .backgroundColor(mixColors('#ff0000', '#000000', 0.8))

      Text(this.displayText)
        .backgroundColor($r(`app.color.start_window_background`))
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Text(this.displayText)
        .backgroundColor(this.resourceColor)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
      Text(this.displayText)
        .backgroundColor(this.convertedColorHex)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
    }
    .height('100%')
    .width('100%')
    .backgroundColor(Color.Orange)
  }
}

在HarmonyOS应用开发中,颜色设置是一项基本但重要的功能。本文将介绍在ArkTS中如何设置颜色的透明度,并探讨如何在两种颜色之间进行混合以得到新的颜色值。

一、设置颜色透明度

在HarmonyOS的ArkTS框架中,可以通过多种方式来设置颜色的透明度。以下是两种常见的方法:

  1. 使用RGBA格式:通过直接指定RGBA值来设置颜色的透明度。
Text('测试1').backgroundColor('rgba(0, 0, 0, 0.5)')
  1. 使用十六进制颜色值:通过在颜色值前加上表示透明度的十六进制数来设置透明度。
Text('测试2').backgroundColor('#80000000')

在此示例中,80表示半透明,00表示不透明,ff表示完全透明。

二、颜色混合方案

在一些应用场景中,需要实现两种颜色之间的混合效果。下面是一个示例,演示如何根据给定的比例混合两种颜色:

/**
 * 根据比例混合两个十六进制颜色值。
 * @param colorA 第一个颜色的十六进制值,例如红色 '#ff0000'。
 * @param colorB 第二个颜色的十六进制值,例如黑色 '#000000'。
 * @param ratio 混合比例,0 表示仅返回 colorA,1 表示仅返回 colorB,介于 0 和 1 之间的值会混合两个颜色。
 * @returns 混合后的颜色的十六进制值。
 */
mixColors(colorA: string, colorB: string, ratio: number): string {
  let mix = (a: number, b: number, ratio: number) => Math.round(a + (b - a) * ratio).toString(16).padStart(2, '0');
  let a = parseInt(colorA.slice(1), 16);
  let b = parseInt(colorB.slice(1), 16);
  let red = mix((a >> 16) & 255, (b >> 16) & 255, ratio);
  let green = mix((a >> 8) & 255, (b >> 8) & 255, ratio);
  let blue = mix(a & 255, b & 255, ratio);
  return `#${red}${green}${blue}`;
}

三、解决预览器颜色显示问题

在使用resourceManager获取颜色值时,可能会遇到在预览器中无法正确显示颜色的问题。为了避免这类问题,建议直接定义颜色常量:如果只是简单的颜色值,建议直接定义字符串类颜色值,如"#000000",这样预览器也能正确显示颜色

标签:十六进制,ArkTS,ratio,示例,let,backgroundColor,颜色,255
From: https://blog.51cto.com/u_16508701/12171545

相关文章

  • VBA中类的解读及应用第十六讲:利用类方法和事件,让文本框在激活时改变颜色(中)
    《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法,属性,事件,接口,接口如何实现等等。掌......
  • Leecode热题100-75.颜色分类
    给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库内置的sort函数的情况下解决这个问题。示例1:输入:num......
  • 鸿蒙应用示例:应用开发中的动态获取属性与调用方法技巧
    随着HarmonyOS的发展,API版本的更新带来了许多新的特性和限制。在API11及以后的版本中,直接赋值对象的语法不再被支持,这要求开发者们采用新的方式来处理对象的创建和属性的访问。同时,HarmonyOS支持ETS(EnhancedTypeScript)文件,这是一种扩展了TypeScript的文件格式,用于更好地支持Harmo......
  • css颜色
    1.前景色<styletype="text/css"> body{ padding:20px; font-family:Arial,Verdana,sans-serif;} /*colorname*/ h1{ color:DarkCyan;} /*hexcode*/ h2{ color:#ee3e80;} /*rgbvalue*/ p{ color......
  • 鸿蒙应用示例:NEXT 中 Map 类型的使用及注意事项
    在JavaScript中,Map对象允许存储任何类型的键和值,提供了键值对的存储功能。在HarmonyOS中,Map的使用基本遵循JavaScript的标准,尤其是要注意set赋值只能用get获取,而索引赋值只能用索引获取。且它们可以同时赋值但遍历的方式又不同。【Map对象的赋值与获取】使用set方法赋值当你需要......
  • 征程6 工具链常用工具和 API 整理(含新手示例)
    1.引言征程6工具链目前已经提供了比较丰富的集成化工具和接口来支持模型的移植和量化部署,本帖将整理常用的工具/接口以及使用示例来供大家参考,相信这篇文章会提升大家对征程6工具链的使用理解以及效率。干货满满,欢迎访问2.hb_config_generatorhb_config_generator是用于获......
  • 第二百六十节 JPA教程 - JPA查询命名参数示例
    JPA教程-JPA查询命名参数示例JPQL支持两种类型的参数绑定语法。第一种是位置绑定,其中参数在查询字符串中通过问号后面跟随参数号来指示。执行查询时,开发人员指定应替换的参数编号。SELECTeFROMEmployeeeWHEREe.department=?1ANDe.salary>?2命名参数......
  • 鸿蒙应用示例:键盘管理从避免遮挡到显示监听的方案实践
    在HarmonyOS应用开发中,键盘管理是一个关键环节,直接影响着用户体验。本文将探讨HarmonyOS键盘管理的几个重要方面,包括如何避免软键盘遮挡输入框、键盘显示与隐藏的监听机制,以及如何手动控制键盘的显示与隐藏。一、避免软键盘遮挡输入框在默认情况下,当用户在输入框中输入文本时,软键盘......
  • <<迷雾>> 第5章 从逻辑学到逻辑电路(4)--或门及其符号 示例电路
    info::操作说明鼠标单击开关切换开合状态系统中使用一个类似箭头的形状表示或门primary::在线交互操作链接https://cc.xiaogd.net/?startCircuitLink=https://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-13-or-gate.txt原图......
  • C++在游戏开发中的卓越性能:优势解析与代码示例
    在游戏开发领域,C++一直是一种备受青睐的编程语言。它以其高性能、灵活性和强大的功能集,成为了游戏开发者的首选语言之一。在本文中,我们将深入探讨C++在游戏开发中的优势,并提供一些代码示例来展示这些优势是如何在实际开发中发挥作用的。高性能与低级控制C++提供接近硬件......