openharmony 鸿蒙 changelogs-arkui

2026-08-25 浏览 (1)

ArkUI子系统Changelog

cl.arkui.1 半模态SIDE侧边样式新增避让软键盘能力

访问级别

公开接口

变更原因

bindSheet半模态弹窗侧边样式默认支持避让软键盘,提升易用性。

变更影响

此变更涉及应用适配。

  • 变更前:当半模态样式指定为SheetType的SIDE侧边样式时,bindSheet的属性keyboardAvoidMode设置为SheetKeyboardAvoidMode的避让软键盘方式无效,半模态默认不避让软键盘,需要开发者自定义避让软键盘。

  • 变更后:当半模态样式指定为SheetType的SIDE侧边样式时,bindSheet的属性keyboardAvoidMode设置为SheetKeyboardAvoidMode的避让软键盘方式将生效,半模态支持避让软键盘,默认值为SheetKeyboardAvoidMode.TRANSLATE_AND_SCROLL。若开发者希望自定义避让软键盘,则需设置属性keyboardAvoidMode = SheetKeyboardAvoidMode.NONE。

起始API Level

API 20

变更发生版本

从OpenHarmony SDK 6.0.0.39开始。

变更的接口/组件

涉及接口: bindSheet的keyboardAvoidMode属性。

SheetType的SIDE半模态侧边样式。

适配指导

默认行为变更,当半模态样式指定为SheetType的SIDE侧边样式时,若开发者期望自定义避让软键盘,则需要设置bindSheet的属性keyboardAvoidMode = SheetKeyboardAvoidMode.NONE。

若开发者期望采用半模态控件自带的避让软键盘能力,则可以设置bindSheet的属性keyboardAvoidMode = SheetKeyboardAvoidMode的其他枚举值,或者不设置属性keyboardAvoidMode,采用默认值。

cl.arkui.2 通用属性drawModifier接口行为变更

访问级别

公开接口

变更原因

(1)当drawModifier接口参数从DrawModifier对象变为undefined时,实际生效的仍是原来的DrawModifier对象。开发者无法重置其值,这与通用属性接口的规范不符。

(2)当前实现中,若组件设置了drawModifier属性,则默认会在生命周期的布局阶段之后触发重绘。对于绘制内容和尺寸均未发生变化的场景,这将导致多余的重绘,造成性能损耗。因此,调整设置drawModifier的节点的重绘规则,默认仅执行过测量过程的节点才进行重绘。

变更影响

此变更涉及应用适配。

  • 变更前:(1)drawModifier接口参数从DrawModifier对象变为undefined后,生效的仍旧是原来的DrawModifier对象。(2)任何组件,如果设置了drawModifier属性,无论是否跳过测量(尺寸是否发生变化),都会触发重绘。

  • 变更后:(1)drawModifier接口参数从DrawModifier对象变为undefined后,会将原来设置的值重置为undefined。(2)任何组件,如果设置了drawModifier属性,当其未跳过测量(尺寸可能发生变化)时,就会触发重绘。

起始API Level

12

变更发生版本

从OpenHarmony SDK 6.0.0.39开始。

变更的接口/组件

drawModifier

适配指导

(1)变更前,this.modifier = undefined;不会清除组件上生效的DrawModifier对象,而变更后则会完成清除。因此,若想保持行为不变,需要注释或删除这一行代码。

(2)若开发者的自定义绘制内容变化逻辑受到本次变更影响,在受影响属性变化的代码后加入invalidate以主动触发重绘,即可完成适配。

具体适配方案可参考下文示例。

import { drawing } from '@kit.ArkGraphics2D';

class MyFrontDrawModifier extends DrawModifier {
  public scaleX: number = 1;
  public scaleY: number = 1;
  public uiContext: UIContext;

  constructor(uiContext: UIContext) {
    super();
    this.uiContext = uiContext;
  }

  drawFront(context: DrawContext): void {
    const brush = new drawing.Brush();
    brush.setColor({
      alpha: 255,
      red: 0,
      green: 0,
      blue: 255
    });
    context.canvas.attachBrush(brush);
    const halfWidth = context.size.width / 2;
    const halfHeight = context.size.width / 2;
    const radiusScale = (this.scaleX + this.scaleY) / 2;
    context.canvas.drawCircle(this.uiContext.vp2px(halfWidth), this.uiContext.vp2px(halfHeight), this.uiContext.vp2px(20 * radiusScale));
  }
}

@Entry
@Component
struct DrawModifierExample {
  @State public modifierToBeCleared: DrawModifier|undefined = new MyFrontDrawModifier(this.getUIContext());
  public modifierToBeChanged: MyFrontDrawModifier = new MyFrontDrawModifier(this.getUIContext());
  @State public testWidth: number = 100;

  build() {
    Column() {
      Button("clearModifier").onClick(() => {
        // 变更前:下面代码不生效,Row组件仍旧绑定原本的modifier
        this.modifierToBeCleared = undefined;
        // 规避方法:变更前若想清空Text组件的自定义绘制效果,可将其绑定的变量变为基类对象
        this.modifierToBeCleared = new DrawModifier();
        // 变更后:若开发者期望行为和变更前保持一致,即下面代码不生效的话,只需要注释掉这一行即可
        // this.modifierToBeCleared = undefined;
      })
      Column() {
        Row()
          .width(100)
          .height(100)
          .margin(10)
          .backgroundColor(Color.Gray)
          .drawModifier(this.modifierToBeCleared)
      }
      .margin({ bottom: 50 })
      Button('changeModifier')
        .onClick(() => {
          this.testWidth++;
          this.modifierToBeChanged.scaleX += 0.1;
          this.modifierToBeChanged.scaleY += 0.1;
          // 变更前自动更新,变更后需要手动调用invalidate方法适配
          this.modifierToBeChanged?.invalidate();
        })
      Column() {
        Row()
          .width(100)
          .height(100)
          .margin(10)
          .backgroundColor(Color.Gray)
          .drawModifier(this.modifierToBeChanged)
        Row() {
          Text("hello world")
            .width(this.testWidth)
            .height(100)
        }
      }
      .width(300)
      .height(300)
    }
  }
}

cl.arkui.3 CanvasRenderer的font接口支持自定义字体行为变更

访问级别

公开接口

变更原因

增强基础能力,CanvasRenderer的font接口支持设置自定义字体。

变更影响

此变更涉及应用适配。

变更前,CanvasRenderer的font接口设置自定义字体不生效,绘制字体显示为默认字体。

变更后,CanvasRenderer的font接口设置自定义字体生效,绘制字体显示为自定义字体。

import { text } from "@kit.ArkGraphics2D"

// xxx.ets
@Entry
@Component
struct FontDemo {
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .backgroundColor('rgb(213,213,213)')
        .onReady(() => {
          let fontCollection = text.FontCollection.getGlobalInstance();
          fontCollection.loadFontSync('HarmonyOS_Sans_Thin_Italic', $rawfile("HarmonyOS_Sans_Thin_Italic.ttf"))
          this.context.font = "50px HarmonyOS_Sans_Thin_Italic"
          this.context.fillText("Hello World", 20, 60)
        })
    }
    .width('100%')
    .height('100%')
  }
}
变更前变更后

起始API Level

API 8

变更发生版本

从OpenHarmony SDK 6.0.0.39开始。

变更的接口/组件

CanvasRenderingContext2D和OffscreenCanvasRenderingContext2D的font接口。

适配指导

变更后,CanvasRenderer的font接口设置自定义字体生效。若需保持变更前的默认字体行为,可以不设置自定义字体。

你可能感兴趣的鸿蒙文章

openharmony 鸿蒙 changelogs-三方库

openharmony 鸿蒙 changelogs-bundlemanager

openharmony 鸿蒙 changelogs-arkts

openharmony 鸿蒙 changelogs-accesscontrol

  • 所属分类: 后端技术
  • 本文标签: 软件 鸿蒙
  • 版权声明: 本文链接 https://seaxiang.com/blog/2TV7q1nf