回复
     HarmonyOS Next 元服务的折叠屏适配简单说明 原创
第一小趴菜
 发布于 2024-11-28 12:33
 浏览
 0收藏
前言
折叠屏的适配在api11及其之前挺麻烦,但是api12之后,display的api接口可以在元服务中使用
步骤
1.获取当前屏幕折叠状态
FoldStatus表示当前可折叠设备的折叠状态枚举。
我们获取屏幕的状态获取的就为FoldStatus的值。
FoldStatus:
| 名称 | 值 | 说明 | 
|---|---|---|
| FOLD_STATUS_UNKNOWN | 0 | 表示设备当前折叠状态未知。 | 
| FOLD_STATUS_EXPANDED | 1 | 表示设备当前折叠状态为完全展开。 | 
| FOLD_STATUS_FOLDED | 2 | 表示设备当前折叠状态为折叠。 | 
| FOLD_STATUS_HALF_FOLDED | 3 | 表示设备当前折叠状态为半折叠。半折叠指完全展开和折叠之间的状态。 | 
有需要的可以根据上方表格进行查询。
查询的方法也很简单
import { display } from '@kit.ArkUI';
@Entry
@Component
struct Index {
  // 我们获取到的FoldStatus
  @State windowStatusType: display.FoldStatus = display.getFoldStatus();
  build() {
    RelativeContainer() {
      // 渲染查看
      Text(String(JSON.stringify(this.windowStatusType)))
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
    }
        .height('100%')
        .width('100%')
  }
}
显示的效果:

但是这样会有一个问题,那就是我们切换折叠屏的时候,不会自动刷新,比如我们如果给他折上,上面显示的数字依旧是1,没有刷新,所以我们下一步就是要绑定状态回调了
2.绑定回调
我们需要让屏幕状态改变的时候,及时的获取到新的状态,这个时候,我们可以通过display.on这个api,进行回调的绑定,我们只要加上下面这段代码,就可以完成回调的绑定
    aboutToAppear(): void {
      let callback: Callback<display.FoldStatus> = (data: display.FoldStatus) => {
        this.windowStatusType = data;
      };
      display.on('foldStatusChange', callback);
    }
这个时候,我们再来试一下效果

这样,我们就把初步内容搞定了
完整代码:
import { display } from '@kit.ArkUI';
import { Callback } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
  // 我们获取到的FoldStatus
  @State windowStatusType: display.FoldStatus = display.getFoldStatus();
    aboutToAppear(): void {
      let callback: Callback<display.FoldStatus> = (data: display.FoldStatus) => {
        this.windowStatusType = data;
      };
      display.on('foldStatusChange', callback);
    }
  build() {
    RelativeContainer() {
      // 渲染查看
      Text(String(JSON.stringify(this.windowStatusType)))
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
              .alignRules({
                center: { anchor: '__container__', align: VerticalAlign.Center },
                middle: { anchor: '__container__', align: HorizontalAlign.Center }
              })
    }
        .height('100%')
        .width('100%')
  }
}
3.页面使用
这个时候我们就可以运用三元表达式或者简单的if语句对我们的折叠屏进行修改,例如:
import { display } from '@kit.ArkUI';
import { Callback } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index {
  // 我们获取到的FoldStatus
  @State windowStatusType: display.FoldStatus = display.getFoldStatus();
    aboutToAppear(): void {
      let callback: Callback<display.FoldStatus> = (data: display.FoldStatus) => {
        this.windowStatusType = data;
      };
      display.on('foldStatusChange', callback);
    }
  build() {
    Flex({ direction: this.windowStatusType == 2?FlexDirection.Column:FlexDirection.Row }) {
      Text('1').height(this.windowStatusType == 2?'50%':'99%').width(this.windowStatusType == 2?'99%':'50%').backgroundColor(0xF5DEB3)
      Text('2').height(this.windowStatusType == 2?'50%':'99%').width(this.windowStatusType == 2?'99%':'50%').backgroundColor(0xD2B48C)
    }
    .height('100%')
    .width('100%')
    .padding(10)
    .backgroundColor(0xAFEEEE)
  }
}
这段代码通过Flex和三元表达式,实现了一个简单的对于折叠屏的屏幕使用,效果如下


结尾
以上就是对折叠屏的适配部分的一个讲解,对于可以直接拿来用的部分,在下面总结一下
总结:
  @State windowStatusType: display.FoldStatus = display.getFoldStatus();
    aboutToAppear(): void {
      let callback: Callback<display.FoldStatus> = (data: display.FoldStatus) => {
        this.windowStatusType = data;
      };
      display.on('foldStatusChange', callback);
    }
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
     
        赞
        2
 
        收藏 
      
 回复
  相关推荐
 



















