在一对一直播系统源码开发中,多种礼物打赏方式,才更能吸引用户的眼球,所在礼物打赏功能开发时,要实现追加、连击等功能。
一对一直播系统源码的礼物追加、连击功能是如何实现的呢?首先礼物从左边滑出,做一个连击数字的动画,然后停留2-3秒后,再消失。其中需要注意的点有以下几个:

1.收到礼物的消息后,因为礼物同时只能展示3个左右,为防止消息丢失,我们需要在一对一直播系统源码中做一个消息队列来缓存这些消息,定时来遍历消息队列。

2.数字的连击动画。

3.当这个礼物view 正处于“连击”中 或者 连击完成但还未消失的这2-3秒内,用户又送了一次礼物,我们需要做一个追加。
在一对一直播系统源码开发时,可以使用一个model AnimMessage来承载一个礼物消息的全部信息,包括送礼物的用户名,礼物数量,礼物名,动画活跃时间,是否连击完成等。

对于问题1.使用list 来作为消息队列,使用计时器来定时清除当前已展示完毕的view,并从队列中取出消息、添加新的view。

private static void startTimer() {mGiftClearTimer = new Timer();mGiftClearTimer.schedule(new TimerTask() {@Overridepublic void run() {final int count = mAnimViewContainer.getChildCount();// 清除礼物for (int i = 0; i < count; i++) {View view = mAnimViewContainer.getChildAt(i);AnimMessage message = (AnimMessage) view.getTag();long nowTime = System.currentTimeMillis();long upTime = message.getUpdateTime();if ((nowTime - upTime) >= mGiftClearInterval) {removeAnimalView(i);return;}}// 添加礼物if (count < mGiftMaxNumber) {if (mGiftList.size() > 0) {((Activity) mContext).runOnUiThread(new Runnable() {@Overridepublic void run() {startGiftAnim(mGiftList.get(0));mGiftList.remove(0);}});}}}}, 0, mGiftClearTimerInterval);
}

uptime是指这个view的最后活跃时间,它需要不断的更新,但是更新的频率不得小于定时器的间隔,否则会被当做已展示完毕的view被清除掉。

对于问题2. 我则是采用的上述demo中的属性动画,做了一些修改,具体看下面代码。

对于问题3. 我们需要先检查后面的礼物消息在当前的展示中是否已有对应的view存在,如果没有,则直接重建,如果已经存在,则是需要更新AnimMessage中的礼物数量,来达到追加的目的,代码如下:

private static void startGiftAnim(final AnimMessage giftMessage) {View giftView = findViewByMessage(giftMessage);if (giftView == null) {//该用户不在礼物显示列表 或者又送了一个新的礼物giftView = addAnimalView(giftMessage);mAnimViewContainer.addView(giftView);/*将礼物的View添加到礼物的ViewGroup中*/mAnimViewContainer.invalidate();} else {//该用户在礼物显示列表  1. 连击动画还未结束,只更新message即可final AnimMessage message = (AnimMessage) giftView.getTag();// 原来的礼物view的信息message.setGiftNum(message.getGiftNum() + giftMessage.getGiftNum()); // 合并追送的礼物数量giftView.setTag(message);if (message.isComboAnimationOver()) {// 2.连击动画已完成 此时view 未消失,除了1 的操作外,还需重新启动连击动画final MagicTextView giftNum = (MagicTextView) giftView.findViewById(R.id.giftNum);giftNum.setText("x" + giftNum.getTag());((LPGiftView) giftView).startComboAnim(giftNum);}}
}
private static View findViewByMessage(AnimMessage message) {for (int i = 0; i < mAnimViewContainer.getChildCount(); i++) {AnimMessage giftMessage = (AnimMessage) mAnimViewContainer.getChildAt(i).getTag();if (giftMessage.getUserName().equals(message.getUserName()) &&giftMessage.getGiftName().equals(message.getGiftName())) {return mAnimViewContainer.getChildAt(i);}}return null;
}

在一对一直播系统源码开发时,通过findViewByMessage 方法来找到当前展示的礼物中是否有对应的view,如果没有则重建,如果有,则分两种情况

(1)正处于连击中,只需要更新礼物上限,即message.setGiftNum 即可。
(2)礼物连击完毕,连击动画已停止,这时候除了更新礼物上限外,还需要重启下连击动画。

 ObjectAnimator anim1 = ObjectAnimator.ofFloat(giftNumView, "scaleX", 1.8f, 1.0f);ObjectAnimator anim2 = ObjectAnimator.ofFloat(giftNumView, "scaleY", 1.8f, 1.0f);AnimatorSet animSet = new AnimatorSet();animSet.setDuration(300);animSet.setInterpolator(new OvershootInterpolator());animSet.playTogether(anim1, anim2);animSet.start();animSet.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}}@Overridepublic void onAnimationEnd(Animator animation) {((AnimMessage) getTag()).setUpdateTime(System.currentTimeMillis());//设置时间标记giftNumView.setTag((Integer) giftNumView.getTag() + 1);//这里用((GiftMessage)giftView.getTag()) 来实时的获取GiftMessage  便于礼物的追加if ((Integer) giftNumView.getTag() <= ((AnimMessage) getTag()).getGiftNum()) {((MagicTextView) giftNumView).setText("x" + giftNumView.getTag());startComboAnim(giftNumView);} else {((AnimMessage)getTag()).setComboAnimationOver(true);return;}}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});
}

上面代码可以看到,我们在一对一直播系统源码中每次执行完一次连击后,来判断是否达到数目的要求,类似一个while循环,如果执行完毕,则将执行完毕的变量设置为true 即可,否则不断的执行动画。

最后就是移除问题了,当这个view 已经不活跃,并且被定时器检查到后,将其移除,另外如果队列中已经没有礼物消息的时候,要定时器停止,在添加消息的时候,再将之重建。

  if (index >= mAnimViewContainer.getChildCount()) {return;}final View removeView = mAnimViewContainer.getChildAt(index);mGiftLayoutOutAnim.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {new Handler().post(new Runnable() {@Overridepublic void run() {mAnimViewContainer.removeViewAt(index);}});if (mGiftList.size() == 0 && mAnimViewContainer.getChildCount() == 0 && mGiftClearTimer != null) {mGiftClearTimer.cancel();mGiftClearTimer = null;}}@Overridepublic void onAnimationRepeat(Animation animation) {}});((Activity) mContext).runOnUiThread(new Runnable() {@Overridepublic void run() {removeView.startAnimation(mGiftLayoutOutAnim);}});
}

以上就是在一对一直播系统源码开发时,礼物打赏可实现的全部功能了。

一对一直播系统源码开发,礼物打赏中追加、连击等功能的实现相关推荐

  1. 一对一直播系统源码,一对一直播系统开发

    做为移动互联网下的新型娱乐模式,直播系统的开发平台可谓是异常的火热,大大小小的直播平台相继出现.经过这两年的发展,很多人早已经对直播行业没有太大的兴趣,.移动互联网时代里,虽然传统的直播仍旧占据了直播 ...

  2. 一对一直播系统源码的开发是推动直播发展的重要一环节

    文/布谷安妮 来源/山东布谷鸟网络 对于直播平台搭建,软件源码的开发,5G技术马上到来,之前遇到的比如延迟.卡顿.掉线等这些情况,都会随着5G时代的带来.源码开发技术的提高完善逐渐消失.一套完整的一对 ...

  3. 一对一直播系统源码的开发是推动直播发展的重要一环节...

    文/布谷安妮 来源/山东布谷鸟网络 对于直播平台搭建,软件源码的开发,5G技术马上到来,之前遇到的比如延迟.卡顿.掉线等这些情况,都会随着5G时代的带来.源码开发技术的提高完善逐渐消失.一套完整的一对 ...

  4. 一对一直播软件源码开发,一对一直播怎么开发

    直播行业自2016年的"千播大战",时至今日,直播平台内容同质化现象严重,反倒是一对一直播软件如"雨后春笋"般进入了人们的视野.一对一直播软件源码开发核心业务模 ...

  5. 一对一直播app源码开发,推流技术的实现

    在说一对一直播app源码推流技术之前,先说一对一直播app源码推流的过程:采集-->前处理-->编码-->推流--->流分发--->播放. 1.采集:音视频采集 pc段屏 ...

  6. 如何只需三步搭建一对一直播系统源码

    随着当下直播行业的红火几乎所有的人手机上都安装了直播app,但是呢直播app也包含很多分类,有一对多直播的还有一对一直播系统,这些系统都是通过直播源码搭建起来的,直播系统开发便获得越来越多程序员的关注 ...

  7. 一对一直播系统源码——如何只需三步搭建

    随着广播行业的蓬勃发展的生活几乎所有人安装应用程序,但是主应用程序还包含很多分类,一对多的直播,一个一个系统,这些系统通过生活建立源代码,广播系统开发从程序员获得越来越多的关注,事实上,只要有一个活系 ...

  8. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  9. 直播系统源码开发:关于安卓开发工具和obs直播推流

    随着移动互联网技术的不算发展,直播系统源码不再局限于娱乐直播的范畴,而是被广泛的应用于各行各业.尤其对于今年来说,购物直播行业的迅速发展,对直播系统源码开发的需求进一步扩大,同时对直播源码开发技术也有 ...

最新文章

  1. python里的“__all__ ”作用
  2. ansible获取linux信息,ansible 获取系统信息的一些范例,ansible系统信息
  3. java selenium教程_Selenium3 Java自动化测试完整教程
  4. 计算机组成原理整机实验报告,计算机组成原理加器实验报告.doc
  5. spring容器管理对象和new对象
  6. 无损链接分解_一点都不能少!伯克利研究人员提出深度学习锻造无损数据压缩新方法...
  7. android备忘录_苹果备忘录怎样把内容置顶?有置顶功能的备忘录便签
  8. 【博客项目】—Joi(八)
  9. NYOJ975 - 关于521
  10. Eclipse探秘-第一章-Eclipse启动(1)
  11. RK3399 Android上面调试IMX291 Camera驱动
  12. office 2016搜索联机模板是灰色的解决方案
  13. 根据身份证号码获取身份证信息(省市县、出生日期、性别)
  14. python把工作簿拆分为工作表_使用Python和Pandas将Excel工作表拆分为单独的工作表...
  15. 【软件构造】正则表达式合法性检测
  16. 2022大宗商品现货交易所织梦网站模板源码+大气美观
  17. LeetCode知识点总结 - 868
  18. POJ(8463)-----Stupid cat Doge(openjudge)
  19. pgsql 使用技巧
  20. 金立金刚GN5001刷机救黑砖

热门文章

  1. 关于NFC使用哪些传输协议
  2. c++,vector的erase循环删除
  3. LiveNVR直播Onvif/RTSP视频流媒体平台遇到离线显示Server returned 5XX Server Error reply如何处理问题分析RTSP借一还多
  4. Git中对大仓库的处理实践
  5. Windows上面maven私服nexus的安装
  6. S2SH水费管理系统-JAVA【计算机毕业设计、源码、开题报告】
  7. 【人力资源管理】第1集 免费开源ERP: Odoo 16 Employees员工管理 构建一体化企业人力资源管理
  8. log4j -Dlog4j.configuration指定日志配置文件无法加载问题
  9. WiFi QC 自动测试:ixChariot API初探
  10. 中国00后身高东亚第一,依旧没逃过“180歧视”