本文实例为大家分享了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 {

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点赞动画仿twritter,Android仿直播特效之点赞飘心效果相关推荐

  1. 微信小程序实现直播间点赞飘心效果的示例代码

    微信小程序实现直播间点赞飘心效果的示例代码 https://blog.csdn.net/qappleh/article/details/83865874

  2. 8:Math.atan2、PathMeasure、点赞飘心效果、点赞数字滚动+1效果、集成支付

    1.Math.atan()与Math.atan2()的区别 angle = Math.atan(slope) 复制代码 slope斜率值为y/x,返回值angle为一个角度的弧度制,因为角度的周期性, ...

  3. 3.使用GSYVideoPlayer实现仿抖音视频播放以及点赞飘心效果

    原创GitHub地址: https://github.com/ZhangZiLiX/DouYinVideoDemo 1.build.gradle配置 applyplugin:'com.android. ...

  4. android旋转动画开源库,android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  5. android+下落+动画,完美起航-Android面试题之动画+事件处理篇

    前言 提示:秋招在即,计蒙准备在国庆假期结束前整理一套Android初级面试题籍,希望对大家有所帮助 提示:以下是本篇文章正文内容 动画 1.Android 中的动画有哪几类 帧动画.补间动画.属性动 ...

  6. android开机动画不播放,android 设置activity启动退出动画 | 解决设置activity 动画不生效问题...

    前提: 如果有动画,最好把activity 设置成透明,不然会有黑屏! true 方法一:代码里面设置 getActivity().startActivity(intent,bundle); getA ...

  7. android 帧动画不播放,Android Frame Animation 帧动画不播放问题。

    今天在我的第一个应用<那些花儿>(养花助手),主页上加了两只翩翩起舞的蝴蝶. 效果图如下: 步骤也是很简单. 1.在anim文件夹内定义动画XML文件 android:oneshot=&q ...

  8. android使用动画画心形,Android中利用画图类和线程画出闪烁的心形,送给亲爱的他(她)...

    本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: 因为前一段时间在写画图类,刚好有一个线程控制画图闪烁的,我就想说我能不能做一个心形闪烁的,出来的效果就如图,先贴再讲 ...

  9. Android仿直播特效之点赞飘心

    一.概述 老规矩先上图 好了,基本就是这个样子,录完的视频用格式工厂转换完就这个样子了,将就看吧 二.定义我们自己的Layout /*** @author 刘洋巴金* @date 2017-4-27* ...

最新文章

  1. 背包思想计算方案的总数(货币系统)
  2. 测试1111111111111111111
  3. c mysql insert语句_MySQL_mysql insert详细讲解,INSERT语法 INSERT [LOW_PRIORITY |DELA - phpStudy...
  4. 读《白帽子讲Web安全》之安全意识篇(一)
  5. 流行的AJAX框架对比:jQuery,Mootools,Dojo,Ext JS
  6. python下载电影网址_python收集电影下载地址
  7. 操作系统 —— 磁盘
  8. AutoLISP圆内接多边形
  9. 广东学考计算机专业要多少排位,太难了!2021年学考录取分数大暴涨!深职、广轻需要300分以上?...
  10. JS数据结构第五篇 --- 二叉树和二叉查找树
  11. turbo c是什么?
  12. C#从入门到精通之第一篇: C#概述与入门
  13. cad编辑节点快捷键是什么_cad2018快捷键大全
  14. linux tomcat war解压吗,Tomcat 何时解压war包
  15. caxa线切割怎样画链轮_在CAXA中怎么画链轮啊?
  16. 数据中台你想知道的都在这里!
  17. 5g消息 服务器出错,中国移动 5G 消息被下架 官方回复技术问题
  18. 听说学习是件苦差事——Linux第一天
  19. 42张动图带你走进神奇的物理世界,超震撼!
  20. android宿舍管理系统源码,基于android的学生宿舍管理系统的实现.doc

热门文章

  1. KMP应用cyk追楠神系列三
  2. Win7 快捷方式变成浏览器图标解决
  3. 今天是一个倒霉的一天
  4. http图片转base64
  5. Python从入门到跑路--第四天
  6. 计算机在人力资源中的应用,计算机技术在人力资源管理中的应用
  7. 10 python程序设计:试卷生成与分析
  8. OpenCV 图像边缘提取(三)—— Laplance算子提取边缘原理及OpenCV API使用(C#)
  9. 2023实体店如何?翻身的机会来了(建议收藏)
  10. Cesium加载离线地图