HarmonyOS 鸿蒙Next开发实现弹幕功能

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

HarmonyOS 鸿蒙Next开发实现弹幕功能

鸿蒙开发怎么实现弹幕功能

5 回复

初始化:并设置弹幕显示相关属性

this.model.setWidth(lpx2px(720))
    this.model.setHeight(lpx2px(720))
    let maxLinesPair: Map<number, number> = new Map();
    maxLinesPair.set(BaseDanmaku.TYPE_SCROLL_RL, 5);
    let overlappingEnablePair: Map<number, boolean> = new Map();
    overlappingEnablePair.set(BaseDanmaku.TYPE_SCROLL_RL, true);
    overlappingEnablePair.set(BaseDanmaku.TYPE_FIX_TOP, true);
    this.mContext = DanmakuContext.create();
    this.mContext.setDanmakuStyle(DANMAKU_STYLE_STROKEN, 3)
      .setDuplicateMergingEnabled(false)
      .setScrollSpeedFactor(1.2)
      .setScaleTextSize(1.2)
      .setCacheStuffer(new SpannedCacheStuffer(), this.mCacheStufferAdapter) // 图文混排使用SpannedCacheStuffer
      .setMaximumLines(maxLinesPair)
      .preventOverlapping(overlappingEnablePair)
      .setDanmakuMargin(40);
    let that = this
    if (this.model != null) {
      this.mParser = this.createParser();
      this.model.setCallback(new Call(that));
      this.model.setOnDanmakuClickListener(new OnDanMu(that))
      this.model.prepare(this.mParser, this.mContext);
      this.model.showFPS(true);
    }
  class Call implements Callback {
  private that: ESObject;

  constructor(that: ESObject) {
    this.that = that
  }

  public updateTimer(timer: DanmakuTimer): void {
  }

  public drawingFinished(): void {

  }

  public danmakuShown(danmaku: BaseDanmaku): void {
  }

  public prepared(): void {
    this.that.model.start();
  }
}
class OnDanMu implements OnDanmakuClickListener {
  private that:ESObject;
  constructor(that :ESObject) {
    this.that = that
  }
  onDanmakuClick(danmakus: IDanmakus): boolean{
    console.log('DFM onDanmakuClick: danmakus size:' + danmakus.size())
    let latest: BaseDanmaku = danmakus.last()
    if (null != latest) {
      console.log('DFM onDanmakuClick: text of latest danmaku:' + latest.text)
      return true
    }
    return false
  };

  onDanmakuLongClick(danmakus: IDanmakus): boolean{
    return false
  };

  onViewClick(view: IDanmakuView): boolean{
    this.that.isVisible = true
    return false
  };
}

添加弹幕

let danmaku: BaseDanmaku = this.mContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL);
    danmaku.text = "这是一条弹幕" + SystemClock.uptimeMillis();
    danmaku.padding = 5;
    danmaku.priority = 0; // 可能会被各种过滤器过滤并隐藏显示
    danmaku.isLive = isLive.valueOf();
    danmaku.setTime(this.model.getCurrentTime() + 1200);
    danmaku.textSize = 25 * (this.mParser.getDisplayer().getDensity() * 0.8);
    danmaku.textColor = 0xffff0000;
    danmaku.textShadowColor = 0xffffffff;
    danmaku.borderColor = 0xff00ff00;
    this.model.addDanmaku(danmaku);

更多关于HarmonyOS 鸿蒙Next开发实现弹幕功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这边对一楼进行补充,该方法使用DanmakuFlameMaster三方库进行功能实现,可通过IDE的Terminal输入如下命令进行安装
ohpm i [@ohos](/user/ohos)/danmakuflamemaster
该库的详细接口及功能可参考以下lian'jie:[@ohos](/user/ohos)/danmakuflamemaster 弹幕框架三方库调用

在HarmonyOS鸿蒙Next开发中,实现弹幕功能可以通过以下步骤进行:

  1. UI布局:使用ArkUI的JS或ETS框架设计弹幕显示区域。利用Stack组件来堆叠弹幕,确保新弹幕能够覆盖旧弹幕。

  2. 数据管理:创建一个数据模型来存储弹幕信息,包括弹幕文本、显示时间、位置等。可以使用数组或自定义数据结构来管理这些数据。

  3. 动画处理:利用ArkUI的动画能力,为弹幕设置从右向左或从上向下的移动效果。可以通过定时器或动画框架来实现弹幕的连续滚动。

  4. 弹幕生成:根据用户输入或预设数据生成新的弹幕,将其添加到数据模型中,并更新UI以显示新弹幕。

  5. 碰撞检测与避让:为避免弹幕重叠,可以加入简单的碰撞检测逻辑。当检测到新弹幕可能与已有弹幕重叠时,调整新弹幕的位置或速度。

  6. 性能优化:在处理大量弹幕时,注意性能优化,如减少不必要的重绘、使用高效的数据结构等。

  7. 事件处理:添加用户交互功能,如暂停、继续、清屏等,提高用户体验。

通过上述步骤,你可以在HarmonyOS鸿蒙Next开发中实现一个基本的弹幕功能。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部