4.细解鸿蒙之元服务UX上架标准-避免与手势系统冲突

187 阅读5分钟

细解鸿蒙之元服务UX上架标准-避免与手势系统冲突

是否必须遵守:必须

标准项描述:

在应用开发过程中,为了丰富用户体验,开发者常常会设计各种自定义手势。这些自定义手势是指应用为用户提供的特定操作方式,例如在屏幕上滑动、点击、捏合等,它们具有独特的功能和用途。

同时,系统本身也有一套手势操作,例如在桌面环境下,通过手势操作来切换应用、查看通知等。当应用自定义手势与系统手势同时存在时,确保它们之间不会产生冲突是非常重要的。
具体来说,应用自定义手势与系统手势无冲突意味着以下几个方面:

操作层面

  • 手势识别:应用自定义手势的识别与系统手势的识别相互独立。应用能够准确识别用户在应用内做出的自定义手势,不会与系统手势混淆。例如,在某个应用中,用户通过双指捏合操作来放大图片,而系统手势中并没有双指捏合的特定操作,应用可以将这个手势识别为自定义手势,而不会与系统手势产生冲突。

  • 操作响应:当用户做出自定义手势时,应用的响应和系统手势的响应不会相互干扰。例如,用户在应用内使用自定义手势进行操作,如滑动屏幕切换页面,系统不会将这个操作识别为系统手势,从而导致系统层面的操作响应,如切换应用或打开通知等。

功能层面

  • 功能区分:应用自定义手势的功能与系统手势的功能不会相互重叠或冲突。应用自定义手势可以实现特定的功能,而系统手势也有其独立的功能。例如,在某个应用中,用户通过自定义手势进行特定的操作,如在地图应用中通过手势缩放地图,而系统手势可能用于切换应用或打开其他系统功能,两者功能互不干扰。

  • 交互逻辑:应用自定义手势的交互逻辑与系统手势的交互逻辑相互协调。应用在设计自定义手势时,需要考虑到系统手势的存在,确保自定义手势的操作逻辑与系统手势的逻辑一致。例如,在应用内使用自定义手势进行操作时,不会与系统手势的操作逻辑产生冲突,从而避免用户在操作过程中产生困惑。

设计层面

  • 设计原则:应用在设计自定义手势时,遵循一定的原则,避免与系统手势冲突。例如,应用可以参考系统手势的操作方式和功能,设计出与系统手势不同的自定义手势。同时,应用也可以根据用户需求和应用场景,合理地设计自定义手势,使其与系统手势相得益彰。

  • 兼容性测试:在应用开发过程中,进行兼容性测试,确保自定义手势与系统手势在不同设备和系统环境下都能正常运行。通过测试,发现并解决可能存在的冲突问题,保证应用的稳定性和用户体验。

总之,应用自定义手势与系统手势无冲突是指应用在设计和开发过程中,充分考虑自定义手势与系统手势的关系,确保它们在操作、功能和设计层面都能相互协调,为用户提供更加丰富、便捷的交互体验。 --javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

对于一般同类型的手势,系统手势优先于自定义手势执行,可以通过priorityGesture或者parallelGesture的方式来绑定自定义手势,例如下面这个示例:

图片长按手势响应失败或冲突,在Image控件上添加长按手势后,长按图片无法响应对应方法,而是图片放大的动画,示例代码如下:

import { promptAction } from '@kit.ArkUI';

// 标记为入口组件
@Entry
// 声明为组件
@Component
struct GesturesConflictScene3 {
  // 存储消息的状态变量
  @State message: string = 'Hello World';

  build() {
    // 创建一个行组件
    Row() {
      // 创建一个列组件
      Column() {
        // 显示文本,使用存储在 message 状态变量中的文本
        Text(this.message)
         .fontSize(50)
         .fontWeight(FontWeight.Bold)
        // 显示图像,使用资源 $r('app.media.startIcon')
        Image($r('app.media.startIcon'))
         .margin({ top: 100 })
         .width(360)
         .height(360)
          // 为图像添加长按手势
         .gesture(
            LongPressGesture({ repeat: true })
              // 长按动作一结束触发,当前未处理任何逻辑
             .onAction((event: GestureEvent) => {
              })
              // 长按动作结束时触发,显示一个 toast 提示
             .onActionEnd(() => {
                promptAction.showToast({ message: 'Long Press' });
              })
          )
      }
      // 设置列组件的宽度为 100%
     .width('100%')
    }
    // 设置行组件的高度为 100%
   .height('100%')
  }
}

这是因为Image组件内置的长按动画和用户自定义的长按手势LongPressGesture冲突了。可以使用priorityGesture绑定手势的方式替代gesture的方式,这样就会只响应自定义手势LongPressGesture了。如果需要两者都执行可以使用parallelGesture的绑定方式
.priorityGesture(
  // 创建一个长按手势对象,repeat 为 true 表示长按动作可以重复触发
  LongPressGesture({ repeat: true })
    // 长按动作进行过程中触发此回调函数,目前未处理任何逻辑
  .onAction((event: GestureEvent) => {
    })
    // 长按动作结束时触发此回调函数
  .onActionEnd(() => {
      // 调用 promptAction.showToast 方法显示一个消息为 'Long Press' 的 toast 提示
      promptAction.showToast({ message: 'Long Press' });
    })
)

PS:实际项目中如有出入,请告知博主,博主会第一时间修改得哇~