HarmonyOS 鸿蒙Next 有什么方式可以实现直播点赞的效果?

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 有什么方式可以实现直播点赞的效果? https://www.w3cschool.cn/article/21386005.html 实现类似这种效果

2 回复

可参考如下Demo实现直播点赞的效果

直播点赞效果实现

示例代码

/**
 * 点赞动画效果组件
 */
const NUMBER_OF_ITEMS = 20;

/**
 * 动画相关参数
 */
const MIN_ANM_DURATION = 120;
const MAX_ANM_DURATION = 180;

/**
 * 表情图片左右偏移距离
 */
const MIN_OFFSET_X = -1;
const MAX_OFFSET_X = 5;

@Component
struct Index{
  @State num: number = 0

  build() {
    Column() {
      Image($r('app.media.icon'))
        .width(36)
        .height(36)
        .onClick(() => {
          this.num++
        })
      FloatLikeView({ clickSum: this.num })
    } .margin({
      top: 500,
      left: 200,
      bottom: 0,
      right: 0
    })
  }
}

@Component
export struct FloatLikeView {
  uiContext: UIContext | undefined = undefined;
  /**
   * 动态图片资源
   */
  private images: Array<Resource> = [$r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon'),
    $r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon'),
    $r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon'),
    $r('app.media.icon'), $r('app.media.icon'), $r('app.media.icon')];
  @State scaleArray: Array<number> = [];
  @State offXArray: Array<number> = [];
  @State offYArray: Array<number> = [];
  @State opacityArray: Array<number> = [];
  @State imageViews: Array<number> = [];
  @State flag: Array<boolean> = [];
  @Prop @Watch('startAnimation') clickSum: number = 0;

  aboutToAppear(): void {
    this.uiContext = this.getUIContext?.();
    for (let i = 0; i < NUMBER_OF_ITEMS; i++) {
      this.imageViews.push(i);
      this.opacityArray.push(0)
      this.offXArray.push(0)
      this.offYArray.push(0)
      this.scaleArray.push(0)
      this.flag.push(false)
    }
  }

  build() {

    Stack() {
      ForEach(this.imageViews, (image: number, index: number) => {
        Image(this.images[image % this.images.length])
          .objectFit(ImageFit.Cover)
          .width(36)
          .height(36)
          .opacity(this.opacityArray[index])
          .scale({ x: this.scaleArray[index], y: this.scaleArray[index] })
          .offset({
            x: this.offXArray[index],
            y: this.offYArray[index]
          })
      }, (image: Resource) => `${image.id}`)
    }
  }

  startAnimation() {
    this.clickAnimation()
  }

  /**
   * 点赞动画
   * 0, 1.18, 0.86, 1
   */
  clickAnimation() {
    if (!this.uiContext) {
      return;
    }
    let index = getRandomInt(0, NUMBER_OF_ITEMS);
    index = index >= NUMBER_OF_ITEMS ? 0 : index;
    while (this.flag[index] === true) {
      index = getRandomInt(0, NUMBER_OF_ITEMS);
      index = index >= NUMBER_OF_ITEMS ? 0 : index;
    }
    this.flag[index] = true;
    this.uiContext.keyframeAnimateTo({
      iterations: 1, onFinish: () => {
        this.flag[index] = false;
      }
    }, [
      {
        duration: 1,
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 0;
          this.opacityArray[index] = 0;
          this.offYArray[index] = 0;
          this.offXArray[index] = 0;
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 0.3;
          this.opacityArray[index] = 0.5;
          this.offYArray[index] = -15;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 0.5;
          this.opacityArray[index] = 0.8;
          this.offYArray[index] = -30;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 0.6;
          this.opacityArray[index] = 0.9;
          this.offYArray[index] = -45;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 0.86;
          this.opacityArray[index] = 1.0;
          this.offYArray[index] = -60;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1.0;
          this.opacityArray[index] = 0.9;
          this.offYArray[index] = -75;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1.0;
          this.opacityArray[index] = 0.8;
          this.offYArray[index] = -90;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1.0;
          this.opacityArray[index] = 0.75;
          this.offYArray[index] = -105;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1.0;
          this.opacityArray[index] = 0.7;
          this.offYArray[index] = -120;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0.6;
          this.offYArray[index] = -135;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0.5;
          this.offYArray[index] = -150;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0.3;
          this.offYArray[index] = -165;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0.2;
          this.offYArray[index] = -180;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0.1;
          this.offYArray[index] = -195;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
      {
        duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
        curve:Curve.Smooth,
        event: () => {
          this.scaleArray[index] = 1;
          this.opacityArray[index] = 0;
          this.offYArray[index] = -210;
          this.offXArray[index] = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
        }
      },
    ])

  }
}

function getRandomInt(min: number, max: number): number {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

更多关于HarmonyOS 鸿蒙Next 有什么方式可以实现直播点赞的效果?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中实现直播点赞的效果,可以通过以下方式实现:

首先,需要确定直播应用的界面布局,其中包括视频显示区域和点赞按钮或交互区域。这通常涉及使用鸿蒙系统的UI框架(如ArkUI)来设计用户界面。

其次,实现点赞功能的核心逻辑。当用户点击点赞按钮或进行其他点赞操作时,应用需要捕获这个事件,并触发相应的业务逻辑。这可能包括增加点赞计数、更新UI显示(如显示点赞动画或更新点赞数量),以及可能需要与服务器通信来记录这个点赞行为。

为了实现与服务器的通信,鸿蒙系统提供了网络请求的相关API,可以用来发送HTTP请求或WebSocket连接等,以将用户的点赞行为同步到服务器。

此外,为了提高用户体验,可以考虑添加一些交互效果,如点赞动画或音效,以及处理网络延迟或错误的情况。

在实现过程中,应确保遵循鸿蒙系统的开发规范和最佳实践,以确保应用的稳定性和性能。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部