细解鸿蒙之元服务 UX 上架标准 - 典型手势时长设计

是否必须遵守:必须

标准项描述:

在应用或元服务的使用过程中,典型手势的时长合理性是一个重要方面。典型手势指的是用户在操作过程中经常使用的、具有特定功能或意义的手势,例如点击、滑动、捏合等。

手势时长的合理性

  1. 用户体验:手势时长合理有助于提升用户体验。如果手势时长过短,用户可能会感觉操作不够流畅,难以准确完成操作。例如,在快速滑动屏幕时,若手势时长过短,可能导致页面滚动不流畅,用户无法顺利到达目标位置。相反,如果手势时长过长,用户可能会感到厌烦,尤其是在需要快速完成操作的情况下。例如,在点击按钮时,若长按时间过长,可能会触发不必要的操作,影响用户体验。
  2. 操作效率:合理的手势时长能够提高操作效率。对于不同的手势操作,都有一个相对合适的时长范围。例如,在进行滑动操作时,手势时长应该根据屏幕内容的大小和用户的操作需求来确定。如果手势时长过短,可能无法完成预期的操作,需要多次重复操作;如果手势时长过长,可能会浪费时间,降低操作效率。
  3. 功能实现:手势时长合理也有助于实现应用或元服务的功能。不同的手势操作可能对应不同的功能,例如在拍照应用中,长按拍照按钮可能会触发连拍功能,这个手势时长需要根据实际需求进行合理设置。如果手势时长不合理,可能会导致功能无法正常实现,影响用户体验。

影响手势时长合理性的因素

  1. 设备类型:不同设备的屏幕尺寸、灵敏度等因素会影响手势时长。例如,在手机屏幕上操作手势可能比在平板电脑或电脑上更容易操作,手势时长也可能会有所不同。
  2. 应用场景:应用的不同场景也会对手势时长产生影响。例如,在游戏应用中,手势操作可能需要更加快速和准确,手势时长可能会相对较短;而在一些需要精细操作的应用中,手势时长可能会相对较长。
  3. 用户习惯:用户的个人习惯和操作方式也会影响手势时长。有些用户可能喜欢快速操作,而有些用户可能更注重操作的准确性,因此手势时长会因人而异。

如何确保手势时长合理

  1. 设计优化:在应用或元服务的设计阶段,充分考虑手势时长的合理性。通过用户调研、测试等方式,了解用户对不同手势操作的需求和期望,从而设计出合理的手势时长。
  2. 测试与反馈:在应用开发过程中进行测试,收集用户反馈,根据用户的实际操作情况对手势时长进行调整。例如,通过用户测试发现手势时长过长或过短,及时进行优化。
  3. 个性化设置:提供手势时长的个性化设置选项,让用户根据自己的需求和习惯进行调整。例如,用户可以在应用设置中调整手势时长,以满足自己的操作需求。

总之,应用或元服务使用的典型手势时长合理是一个综合考虑用户体验、操作效率和功能实现的重要方面。通过合理设计和优化手势时长,能够提高用户的操作体验,增强应用或元服务的功能。

--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

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

  build() {
    // 创建一个列组件
    Column() {
      // 创建一个行组件,行内元素间距为 20
      Row({ space: 20 }) {
        // 创建一个文本组件,显示 message 状态变量的内容,设置宽度为 200,高度为 80,背景颜色为粉色,字体大小为 25
        Text(this.message).width(200).height(80).backgroundColor(Color.Pink)
        .fontSize(25)
      }.margin(20)
    }
    // 设置列组件的宽度为 100%
  .width('100%')
    // 设置列组件的高度为 200
  .height(200)
    // 设置边框宽度为 2
  .borderWidth(2)
    // 当开始拖动时触发此回调函数
  .onDragStart(() => {
      // 将 message 状态更新为 'drag'
      this.message = 'drag'
      // 打印日志,表示拖动开始
      console.log("Drag start.")
    })
    // 为组件添加点击手势
  .gesture(
      TapGesture()
        // 设置点击手势的标志为 'tap1'
      .tag("tap1")
        // 当点击动作触发时,将 message 状态更新为 'tap1'
      .onAction(() => {
          this.message = 'tap1'
        })
    )
    // 为组件添加长按手势
  .gesture(
      LongPressGesture()
        // 设置长按手势的标志为 'longPress1'
      .tag("longPress1")
        // 当长按动作触发时,将 message 状态更新为 'longPress'
      .onAction(() => {
          this.message = 'longPress'
        })
    )
    // 为组件添加滑动手势
  .gesture(
      SwipeGesture()
        // 设置滑动手势的标志为 'swipe1'
      .tag("swipe1")
        // 当滑动动作触发时,将 message 状态更新为 'swipe1'
      .onAction(() => {
          this.message = 'swipe1'
        })
    )
    // 为组件添加拖动手势
  .gesture(
      PanGesture()
        // 设置拖动手势的标志为 'pan1'
      .tag("pan1")
        // 当拖动手势开始时,将 message 状态更新为 'pan1'
      .onActionStart(() => {
          this.message = 'pan1'
        })
    )
    // 当开始判断手势时触发此回调函数
  .onGestureJudgeBegin((gestureInfo: GestureInfo, event: BaseGestureEvent) => {
      // 若手势类型为长按手势,将事件对象转换为长按手势事件对象并打印相关信息
      if (gestureInfo.type == GestureControl.GestureType.LONG_PRESS_GESTURE) {
        let longPressEvent = event as LongPressGestureEvent;
        console.log("repeat " + longPressEvent.repeat)
      }
      // 若手势类型为滑动手势,将事件对象转换为滑动手势事件对象并打印相关信息
      if (gestureInfo.type == GestureControl.GestureType.SWIPE_GESTURE) {
        let swipeEvent = event as SwipeGestureEvent;
        console.log("angle " + swipeEvent.angle)
      }
      // 若手势类型为拖动手势,将事件对象转换为拖动手势事件对象并打印相关信息
      if (gestureInfo.type == GestureControl.GestureType.PAN_GESTURE) {
        let panEvent = event as PanGestureEvent;
        console.log("velocity " + panEvent.velocity)
      }
      // 自定义判定标准
      if (gestureInfo.type == GestureControl.GestureType.DRAG) {
        // 返回 REJECT 会使拖动手势失败
        return GestureJudgeResult.REJECT;
      } else if (gestureInfo.tag == 'longPress1' && event.fingerList.length > 0 && event.fingerList[0].localY < 100) {
        // 返回 CONTINUE 将保持系统判定
        return GestureJudgeResult.CONTINUE;
      }
      return GestureJudgeResult.CONTINUE;
    })
  }
}

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