Android仿直播特效之点赞飘心效果

本文实例为大家分享了Android实现点赞飘心效果的具体代码,供大家参考,具体内容如下

一、概述

老规矩先上图

好了,基本就是这个样子,录完的视频用格式工厂转换完就这个样子了,将就看吧

二、定义我们自己的Layout

/**
 * @author 刘洋巴金
 * @date 2017-4-27
 *
 * 定义我们自己的布局
 * */
public class LoveLayout extends RelativeLayout{ 

 private Context context;
 private LayoutParams params;
 private Drawable[] icons = new Drawable[4];
 private Interpolator[] interpolators = new Interpolator[4];
 private int mWidth;
 private int mHeight; 

 public LoveLayout(Context context, AttributeSet attrs) {
  super(context, attrs); 

  this.context = context;
  initView();
 } 

 private void initView() { 

  // 图片资源
  icons[0] = getResources().getDrawable(R.drawable.green);
  icons[1] = getResources().getDrawable(R.drawable.purple);
  icons[2] = getResources().getDrawable(R.drawable.red);
  icons[3] = getResources().getDrawable(R.drawable.yellow); 

  // 插值器
  interpolators[0] = new AccelerateDecelerateInterpolator(); // 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
  interpolators[1] = new AccelerateInterpolator(); // 在动画开始的地方速率改变比较慢,然后开始加速
  interpolators[2] = new DecelerateInterpolator(); // 在动画开始的地方快然后慢
  interpolators[3] = new LinearInterpolator(); // 以常量速率改变 

  int width = icons[0].getIntrinsicWidth();
  int height = icons[0].getIntrinsicWidth();
  params = new LayoutParams(width, height);
  params.addRule(CENTER_HORIZONTAL, TRUE);
  params.addRule(ALIGN_PARENT_BOTTOM, TRUE);
 }

基本就是做了初始化,声明了4个drawable,也就是4个颜色的心,4个插值器,用于控制动画速率的改变,设置初始位置为屏幕的下边中点处。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 // TODO Auto-generated method stub
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 mWidth = getMeasuredWidth();
 mHeight = getMeasuredHeight();
} 

public void addLoveView() {
 // TODO Auto-generated method stub
 final ImageView iv = new ImageView(context);
 iv.setLayoutParams(params);
 iv.setImageDrawable(icons[new Random().nextInt(4)]);
 addView(iv); 

 // 开启动画,并且用完销毁
 AnimatorSet set = getAnimatorSet(iv);
 set.start();
 set.addListener(new AnimatorListenerAdapter() {
  @Override
  public void onAnimationEnd(Animator animation) {
   // TODO Auto-generated method stub
   super.onAnimationEnd(animation);
   removeView(iv);
  }
 });
}

用于添加心型效果。动画结束后,再移除

/**
 * 获取动画集合
 * @param iv
 * */
private AnimatorSet getAnimatorSet(ImageView iv) { 

 // 1.alpha动画
 ObjectAnimator alpha = ObjectAnimator.ofFloat(iv, "alpha", 0.3f, 1f); 

 // 2.缩放动画
 ObjectAnimator scaleX = ObjectAnimator.ofFloat(iv, "scaleX", 0.2f, 1f);
 ObjectAnimator scaleY = ObjectAnimator.ofFloat(iv, "scaleY", 0.2f, 1f); 

 // 动画集合
 AnimatorSet set = new AnimatorSet();
 set.playTogether(alpha, scaleX, scaleY);
 set.setDuration(500); 

 // 贝塞尔曲线动画
 ValueAnimator bzier = getBzierAnimator(iv); 

 AnimatorSet set2 = new AnimatorSet();
 set2.playSequentially(set, bzier);
 set2.setTarget(iv);
 return set2;
}

playTogether:几个动画同时执行
ObjectAnimator为属性动画,不熟悉可以百度了解下

然后是设置贝塞尔曲线动画

playSequentially:动画依次执行

/**
 * 贝塞尔动画
 * */
private ValueAnimator getBzierAnimator(final ImageView iv) {
  // TODO Auto-generated method stub
 PointF[] PointFs = getPointFs(iv); // 4个点的坐标
 BasEvaluator evaluator = new BasEvaluator(PointFs[1], PointFs[2]);
 ValueAnimator valueAnim = ValueAnimator.ofObject(evaluator, PointFs[0], PointFs[3]);
 valueAnim.addUpdateListener(new AnimatorUpdateListener() { 

  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
   // TODO Auto-generated method stub
   PointF p = (PointF) animation.getAnimatedValue();
   iv.setX(p.x);
   iv.setY(p.y);
   iv.setAlpha(1- animation.getAnimatedFraction()); // 透明度
  }
 });
 valueAnim.setTarget(iv);
 valueAnim.setDuration(3000);
 valueAnim.setInterpolator(interpolators[new Random().nextInt(4)]);
 return valueAnim;
} 

private PointF[] getPointFs(ImageView iv) {
 // TODO Auto-generated method stub
 PointF[] PointFs = new PointF[4];
 PointFs[0] = new PointF(); // p0
 PointFs[0].x = (mWidth- params.width)/ 2;
 PointFs[0].y = mHeight - params.height; 

 PointFs[1] = new PointF(); // p1
 PointFs[1].x = new Random().nextInt(mWidth);
 PointFs[1].y = new Random().nextInt(mHeight /2) + mHeight / 2 + params.height; 

 PointFs[2] = new PointF(); // p2
 PointFs[2].x = new Random().nextInt(mWidth);
 PointFs[2].y = new Random().nextInt(mHeight /2); 

 PointFs[3] = new PointF(); // p3
 PointFs[3].x = new Random().nextInt(mWidth);
 PointFs[3].y = 0;
 return PointFs;
}

先获得4个点的坐标

p0坐标:x坐标((布局的宽-心形图片宽)除以2),y坐标(布局的高 -心形图片高),这样获得的是顶部部水平中心点的坐标。

p1坐标:x坐标(横坐标中的随机位置),y坐标(布局一半的高度 加上 0到一半高度范围内的随机坐标+心形的高度的一半)。这样取到的横坐标是在布局宽度之内的随机坐标,纵坐标为整个路径高度中部以上的随机坐标。

p2坐标:与p1类似,横坐标是在布局宽度之内的随机坐标,纵坐标为整个路径高度中部以下的随机坐标。

p3坐标:控件底部中心点

好了知道4个坐标了,那么开始计算路径

首先为了计算贝塞尔曲线,我们先写一个估值器

/**
 * @author 刘洋巴金
 * @date 2017-4-27
 *
 * 估值器,计算路径
 * */
public class BasEvaluator implements TypeEvaluator<PointF> { 

 private PointF p1;
 private PointF p2; 

 public BasEvaluator(PointF p1, PointF p2) {
  super();
  this.p1 = p1;
  this.p2 = p2;
 } 

 @Override
 public PointF evaluate(float fraction, PointF p0, PointF p3) {
  // TODO Auto-generated method stub
  PointF pointf = new PointF(); 

  // 贝塞尔曲线公式 p0*(1-t)^3 + 3p1*t*(1-t)^2 + 3p2*t^2*(1-t) + p3^3
  pointf.x = p0.x * (1-fraction) *(1-fraction ) * (1-fraction)
     +3*p1.x * fraction *(1-fraction )*(1-fraction )
     +3*p2.x *fraction *fraction *(1-fraction )
     +p3.x*fraction *fraction *fraction ;
  pointf.y = p0.y * (1-fraction ) *(1-fraction ) * (1-fraction )
    +3*p1.y * fraction *(1-fraction )*(1-fraction )
    +3*p2.y *fraction *fraction *(1-fraction )
    +p3.y*fraction *fraction *fraction ;
  return pointf;
 }
}

TypeEvaluator:估值器回调evaluate方法,用于动态的改变动画的属性值。
evaluate三个参数:

1.fraction,默认传入的就是(currentTime - startTime) / duration,动画执行的时间除以总的时间比值,可以理解为变化率。当duration到了的时候,正好,起始点变到终点。

2.起始点

3.终点

根据三个参数,计算点的根据每毫秒的变化率,计算点的路径轨迹。

好了贝塞尔曲线动画就讲完了,然后再把动画绑定到控件上。

最后在MainActivity中根据点击事件,进行增加心型就好了。

btn_press = (Button)findViewById(R.id.btn_press);
ll_love = (LoveLayout)findViewById(R.id.ll_love);
btn_press.setOnClickListener(new OnClickListener() { 

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  ll_love.addLoveView();
 }
});

三、Demo

Android实现点赞飘心效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android直播app送礼物连击动画效果(实例代码)
  • Android 实现仿网络直播弹幕功能详解及实例
  • Android实现炫酷的网络直播弹幕功能
  • Android仿斗鱼直播的弹幕效果
  • Android自定义View模仿虎扑直播界面的打赏按钮功能
  • Android高级UI特效仿直播点赞动画效果
  • android实现直播点赞飘心动画效果
  • Android控件实现直播App特效之点赞飘心动画
  • Android贝塞尔曲线实现直播点赞效果
  • Android实现直播聊天区域中顶部的渐变效果
(0)

相关推荐

  • Android高级UI特效仿直播点赞动画效果

    本文给大家分享高级UI特效仿直播点赞效果-一个优美炫酷的点赞动画,具体实现代码大家参考本文. 效果图如下: 攻克难点: 心形图片的路径等走向 心形图片的控制范围 部分代码如下: 通过AbstractPathAnimator定义飘心动画控制器 @Override public void start(final View child, final ViewGroup parent) { parent.addView(child, new ViewGroup.LayoutParams(mConfig.

  • Android贝塞尔曲线实现直播点赞效果

    本文实例为大家分享了Android实现直播点赞效果的具体代码,供大家参考,具体内容如下 效果展示 原理分析 点赞效果最主要的难点和原理在于贝塞尔曲线动画的生成,我们通过图片主要讲解贝塞尔曲线动画 1.需要找到贝塞尔曲线的四个点 2.通过三级贝塞尔曲线的公式计算,获取贝塞尔曲线的轨迹路径点 3.通过设置点赞图片X,Y坐标,从而形成点赞的效果 实现步骤 1.初始化变量 //1.继承RelativeLayout public class ChristmasView extends RelativeLa

  • Android直播app送礼物连击动画效果(实例代码)

    最近在做公司的直播项目,需要实现一个观看端连击送礼物的控件: 直接上代码: /** * @author yangyinglong on 2017/7/11 16:52. * @Description: todo(这里用一句话描述这个类的作用) * @Copyright Copyright (c) 2017 Tuandai Inc. All Rights Reserved. */ public class CustomGiftView extends LinearLayout { private

  • Android控件实现直播App特效之点赞飘心动画

    现在市面上直播类的应用可以说是一抓一大把,随随便便就以什么主题来开发个直播App,说白了就想在这领域分杯羹.在使用这些应用过程中其实不难发现,在所有的直播界面,少不了的就是各种打赏.各种点赞.今天自己就针对点赞功能敲了一下,代码不多,主要是涉及到动画运动轨迹运算,这里需借助 贝塞尔曲线 相关知识,我使用三阶贝塞尔曲线来实现轨迹动画. 运行效果 一.具体实现流程 仔细分析整个点赞过程可以发现,首先是"爱心"的出现动画,然后是"爱心"以类似气泡的形式向上运动. &quo

  • Android自定义View模仿虎扑直播界面的打赏按钮功能

    前言 作为一个资深篮球爱好者,我经常会用虎扑app看比赛直播,后来注意到文字直播界面右下角加了两个按钮,可以在直播过程中送虎扑币,为自己支持的球队加油. 具体的效果如下图所示: 我个人觉得挺好玩的,所以决定自己实现下这个按钮,废话不多说,先看实现的效果吧: 这个效果看起来和popupwindow差不多,但我是采用自定义view的方式来实现,下面说说过程. 实现过程 首先从虎扑的效果可以看到,它这两个按钮时浮在整个界面之上的,所以它需要和FrameLayout结合使用,因此我让它的宽度跟随屏幕大小

  • Android实现直播聊天区域中顶部的渐变效果

    背景 在4月份开发直播时,有一个需求,需要实现一个RecylerView顶部渐变的效果 实际效果 解决思路 图层重叠处理(本质是alpha叠加出来的效果) 实现流程 保存一个图层,然后画渐变,最后再和原来的图层进行合并,达到这个效果. 涉及知识(不知道的请google): *      主要通过RecyclerView 的 ItemDecoration类进行解决. *      Paint.Canvas.Shader.Xfermode(图层融合) *      Gradient(渐变) 详细过程

  • Android 实现仿网络直播弹幕功能详解及实例

    Android 网络直播弹幕                最近看好多网络电视,播放器及直播都有弹幕功能,自己周末捣鼓下并实现,以下是网上的资料,大家可以看下. 现在网络直播越来越火,网络主播也逐渐成为一种新兴职业,对于网络直播,弹幕功能是必须要有的,如下图: 首先来分析一下,这个弹幕功能是怎么实现的,首先在最下面肯定是一个游戏界面View,然后游戏界面上有弹幕View,弹幕的View必须要做成完全透明的,这样即使覆盖在游戏界面的上方也不会影响到游戏的正常观看,只有当有人发弹幕消息时,再将消息绘

  • Android仿斗鱼直播的弹幕效果

    记得之前有位朋友在我的公众号里问过我,像直播的那种弹幕功能该如何实现?如今直播行业确实是非常火爆啊,大大小小的公司都要涉足一下直播的领域,用斗鱼的话来讲,现在就是千播之战.而弹幕则无疑是直播功能当中最为重要的一个功能之一,那么今天,我就带着大家一起来实现一个简单的Android端弹幕效果. 分析 首先我们来看一下斗鱼上的弹幕效果,如下图所示: 这是一个Dota2游戏直播的界面,我们可以看到,在游戏界面的上方有很多的弹幕,看直播的观众们就是在这里进行讨论的. 那么这样的一个界面该如何实现呢?其实并

  • android实现直播点赞飘心动画效果

    前段时间在写直播的时候,需要观众在看直播的时候点赞的效果,在此参照了腾讯大神写的点赞(飘心动画效果).下面是效果图: 1.自定义飘心动画的属性 在attrs.xml 中增加自定义的属性 <!-- 飘心动画自定义的属性 --> <declare-styleable name="HeartLayout"> <attr name="initX" format="dimension"/> <attr name=&

  • Android实现炫酷的网络直播弹幕功能

    现在网络直播越来越火,网络主播也逐渐成为一种新兴职业,对于网络直播,弹幕功能是必须要有的,如下图: 首先来分析一下,这个弹幕功能是怎么实现的,首先在最下面肯定是一个游戏界面View,然后游戏界面上有弹幕View,弹幕的View必须要做成完全透明的,这样即使覆盖在游戏界面的上方也不会影响到游戏的正常观看,只有当有人发弹幕消息时,再将消息绘制到弹幕的View上面就可以了,下方肯定还有有操作界面View,可以让用户来发弹幕和送礼物的功能,原理示意图如下所示: 参照原理图,下面一步一步来实现这个功能.

随机推荐