放yy直播点赞动画

news/2024/11/30 0:39:09/

最近在做直播相关的东西,这个动画是IOS先撸出来的,后来android这边要模仿,大部分直播应用都有很炫酷的点赞动画,所以也没什么好稀奇的。如果有现成的轮子了,就没必要自己再造了,后来参照了程序亦非猿的实现,做了些修改,最终效果还不错。


live.gif

刚开始自己造轮子的时候也走了些弯路,最初是给这些图标一些随机的初始速度和偏移量然后慢慢上升,效果总是不大好,差了点意思。后来仔细研究发现这些图标上升的路线并不是直线,而是一个三阶贝塞尔曲线。

  一阶贝塞尔曲线,实际上就是一条连接两点的直线段。二阶贝塞尔曲线,就是两点间的一条抛物线,利用一个控制点来控制抛物线的形状。三阶贝塞尔曲线,则需要一个起点,一个终点,两个控制点来控制曲线的形状。

三节贝塞尔曲线的公式


公式.png

公式中:P0,是我们的起点,P3是终点,P1,P2是途径的两个点,而t则是一个因子,取值范围是0-1。
整个曲线的生成过程


过程.gif

实现代码如下,调用的时候只需要在构造方法中传入两个随机点即可。

    public class BesselEvaluator implements TypeEvaluator<float[]> {private float point1[] = new float[2], point2[] = new float[2];public BesselEvaluator(float[] point1, float[] point2) {this.point1 = point1;this.point2 = point2;}@Overridepublic float[] evaluate(float fraction, float[] point0, float[] point3) {float[] currentPosition = new float[2];currentPosition[0] = point0[0] * (1 - fraction) * (1 - fraction) * (1 - fraction)+ point1[0] * 3 * fraction * (1 - fraction) * (1 - fraction)+ point2[0] * 3 * (1 - fraction) * fraction * fraction+ point3[0] * fraction * fraction * fraction;currentPosition[1] = point0[1] * (1 - fraction) * (1 - fraction) * (1 - fraction)+ point1[1] * 3 * fraction * (1 - fraction) * (1 - fraction)+ point2[1] * 3 * (1 - fraction) * fraction * fraction+ point3[1] * fraction * fraction * fraction;return currentPosition;}}

详细的动画实现可以参考一步一步教你实现Periscope点赞效果,但很显然我这里完成点赞动画,任务还没有完成。有几个问题需要解决:允许连续点赞,而且是计数的,什么时候把点赞的数量抛给服务器;我怎么看到其他用户点赞,或者其他用户怎么看的到我点赞。

先看第一个问题吧,什么时候把点赞数量抛给服务器?由于产品经理带着小姨子跑路了,Ios和android两个端的策略还不太一样,但我们达成的基本共识就是:不能点一次抛一次,抛的次数越少越好。Ios是本地维护一个count,没隔一段时间检测count有增加,就抛一次。android这里是连续点击的时间间隔大于一个约定值,就认为本轮点赞结束,然后抛一次。以前有研究过单击双击,这次连续点击也来了,该来的总要来的。

public class MainActivity extends AppCompatActivity {long mLastTime = 0;long mCurTime = 0;private final int DELAY = 500;//连续点击的临界点BubbleView bubbleView;private int mClickCount = 0;private int currLikeCount;private TextView likeCount;private Timer delayTimer;private TimerTask timeTask;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {praiseRequest(mClickCount);delayTimer.cancel();super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);bubbleView=(BubbleView)findViewById(R.id.praise_anim);bubbleView.setDefaultDrawableList();likeCount = (TextView) findViewById(R.id.like_count);FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mCurTime = System.currentTimeMillis();if (mCurTime - mLastTime < DELAY) {mClickCount++;} else {mClickCount = 1;}currLikeCount++;likeCount.setText(String.valueOf(currLikeCount));delay();mLastTime = mCurTime;bubbleView.startAnimation(bubbleView.getWidth(), bubbleView.getHeight());}});}private void delay() {if (timeTask != null)timeTask.cancel();timeTask = new TimerTask() {@Overridepublic void run() {Message message = new Message();mHandler.sendMessage(message);}};delayTimer = new Timer();delayTimer.schedule(timeTask, DELAY);}/*** 点赞请求网络*/private void praiseRequest(int count) {}
}

第二个问题由于暂时没条件做推送,所以只能客户端每隔一段时间轮一次接口了,如果相比较上次数量有增加,动画上就弹出相应数量的爱心数,这里就需要给屏幕上允许出现的爱心数量设置一个最大值,要不然一瞬间弹出几百个甚至上千个肯定要悲剧了。


576DB36E-F179-47A0-A216-8C05381BCC94-1540-0000D86DB0CDA3D2.gif

后期将做进一步的拓展,实现详情效果


http://www.ppmy.cn/news/568937.html

相关文章

python 爬虫入门示例

目录 一、安装 requests 模块二、发送请求&#xff0c;获取json字符串响应三、发送请求&#xff0c;获取 html 网页并解析获取文本 一、安装 requests 模块 pip install requests二、发送请求&#xff0c;获取json字符串响应 爬取接口示例&#xff0c;这里以 Get 请求为例&am…

【备战秋招】每日一题:2023.04.12-华为OD机是(第一题)-购物系统的降级策略

为了更好的阅读体检&#xff0c;可以查看我的算法学习网站 在线评测链接:P1189 题目内容 在一个购物APP中&#xff0c;有一个核心购物系统&#xff0c;它的接口被 N N N 个客户端调用。这些客户端负责处理来自不同渠道的交易请求&#xff0c;并将这些请求发送给核心购物系统…

跌倒检测 关节点角度数学计算

参考&#xff1a; https://github.com/GitGudwl/MediapipePoseEstimationForFallDetection/tree/main https://blog.csdn.net/weixin_45824067/article/details/130646962 1、mediapipe 根据关节点角度计算 1、11与12取中间点&#xff0c;记为center_up; 23 与24取中间点记为c…

Python网络编程:socket包的用法

持续补充 1 网络编程 网络编程&#xff0c;主要用于两台或多台计算机之间的通信&#xff0c;也可以是同一台计算机内不同进程之间的通信。Socket套接字可以用来实现网络通信。关于Socket套接字&#xff0c;需要注意以下几点&#xff1a; Socket是网络通信中应用层和传输层之间…

抖音林客系统定制开发

抖音林客是一款提供旅游攻略和景点推荐的短视频社交平台&#xff0c;主要用户群体为喜欢旅游和分享生活的年轻人。从需求分析角度来看&#xff0c;可以从以下几个方面进行分析&#xff1a; 信息获取需求&#xff1a;抖音林客用户需求获取有关旅游的详细和实用的信息&#x…

[转帖]房博士教你购房(二)

rel"File-List" href"file:///C:%5CDOCUME%7E1%5C%E7%8E%8B%E6%B5%B7%E6%B6%9B%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> 什么是花园小区、智能小区、远郊小区   花园小区、智能小区、远郊小区是未来小区发展的三种标准和趋势&am…

荨麻疹【指南共识】

荨麻疹 引文参考&#xff1a; 中华医学会皮肤性病学分会免疫学组. 中国慢性诱导性荨麻疹诊治专家共识&#xff08;2023&#xff09;[J]&#xff0e;中华皮肤科杂志&#xff0c;2023, 56&#xff08;6&#xff09;:479-488. doi&#xff1a;10.35541/cjd.20220819 【摘要】 …

STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习1(AD单通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…