Android自定义View实现抖音飘动红心效果
时间:2022-07-26
本文章向大家介绍Android自定义View实现抖音飘动红心效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了Android自定义View实现抖音飘动红心效果的具体代码,供大家参考,具体内容如下
自定义View——抖音飘动红心
效果展示
动画效果
使用自定义view完成红心飘动效果
View实现
动画:属性动画(位移+缩放+透明度+旋转) + 随机数:(属性动画参数+颜色选取)
View
/**
* 飘心效果
* 1.创建ImageView
* 2.ImageView执行组合动画
* 3.动画执行完成后销毁View
*/
public class FlyHeartView extends RelativeLayout {
private int defoutWidth = 200;//默认控件宽度
private long mDuration = 3000;//默认动画时间
//颜色集合 从中获取颜色
private int[] color = {
0xFFFF34B3, 0xFF9ACD32, 0xFF9400D3, 0xFFEE9A00,
0xFFFFB6C1, 0xFFDA70D6, 0xFF8B008B, 0xFF4B0082,
0xFF483D8B, 0xFF1E90FF, 0xFF00BFFF, 0xFF00FF7F
};
public FlyHeartView(Context context) {
super(context);
initFrameLayout();
}
public FlyHeartView(Context context, AttributeSet attrs) {
super(context, attrs);
initFrameLayout();
}
private void initFrameLayout() {
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(defoutWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(params);
}
/**
* 创建一个心形的view视图
*/
private ImageView createHeartView() {
ImageView heartIv = new ImageView(getContext());
LayoutParams params = new LayoutParams(defoutWidth / 2, defoutWidth / 2);
//控件位置
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
heartIv.setLayoutParams(params);
heartIv.setImageResource(R.mipmap.ic_heart);
//改变颜色
heartIv.setImageTintList(ColorStateList.valueOf(color[(int) (color.length * Math.random())]));
return heartIv;
}
/**
* 执行动画
* 在展示调用该方法
*/
public void startFly() {
final ImageView heartIv = createHeartView();
addView(heartIv);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(createTranslationX(heartIv))
.with(createTranslationY(heartIv))
.with(createScale(heartIv))
.with(createRotation(heartIv))
.with(createAlpha(heartIv));
//执行动画
animatorSet.start();
//销毁view
animatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
removeView(heartIv);
}
});
}
/**
* 横向正弦位移动画
*
* @return
*/
private Animator createTranslationX(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationX", 0, (float) (defoutWidth * Math.random() / 4));
animator.setDuration(mDuration);
//CycleInterpolator cycles 正弦曲线数
animator.setInterpolator(new CycleInterpolator((float) (3 * Math.random())));
return animator;
}
/**
* 纵向加速位移动画
*
* @return
*/
private Animator createTranslationY(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", 0, -1000);
animator.setDuration(mDuration);
animator.setInterpolator(new AccelerateInterpolator());
return animator;
}
/**
* 加速放大动画
*
* @return
*/
private Animator createScale(View view) {
ObjectAnimator animatorX = ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f);
ObjectAnimator animatorY = ObjectAnimator.ofFloat(view, "scaleY", 1, 1.5f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(mDuration);
animatorSet.setInterpolator(new AccelerateInterpolator());
animatorSet.play(animatorX).with(animatorY);
return animatorSet;
}
/**
* 透明度动画
*
* @return
*/
private Animator createAlpha(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 1, 0.1f);
animator.setDuration(mDuration);
animator.setInterpolator(new AccelerateInterpolator());
return animator;
}
/**
* 旋转动画
*
* @return
*/
private Animator createRotation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotation", 0, (float) (25f * Math.random()));
animator.setDuration(mDuration);
animator.setInterpolator(new CycleInterpolator((float) (6 * Math.random())));
return animator;
}
}
最后在MainActivity中调用FlyHeartView 的startFly()方法就能实现点击飘心效果。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 实例分享微信小程序项目搭建(下)
- 实例分享微信小程序项目搭建(上)
- Android6.0源码分析之蓝牙显示接收到的文件
- Android中应用调用系统权限
- Android5.0以后隐式启动ServiceBug
- Android6.0源码分析之录音功能(一)
- Android6.0源码开发之修改默认音量default及max和min
- Android源码开发之添加/删除系统应用
- 按键事件处理
- Android6.0锁屏源码分析之界面布局分析
- Android6.0源码分析之menu键弹出popupwindow菜单流程分析
- Android中初步自定义view
- Android中View研究自学之路 Android6.0源码分析之View(一)Android6.0源码分析之View(二)
- Android蓝牙配对弹出框过程分析 Android蓝牙配对弹出框过程分析
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【一天一大 lee】两两交换链表中的节点 (难度:中等) - Day20201013
- 【一天一大 lee】二叉搜索树的最小绝对差 (难度:简单) - Day20201012
- 有奖互动 | 腾讯云开发者社区 3 周年庆,我过生日,送你们礼物 ~
- 【一天一大 lee】分割等和子集 (难度:中等) - Day20201011
- 【一天一大 lee】寻找两个正序数组的中位数 (难度:困难) - Day20201003
- 【一天一大 lee】颜色分类 (难度:中等) - Day20201007
- 【一天一大 lee】树中距离之和 (难度:困难) - Day20201006
- 在Spring项目中以多线程的方式并发执行,异步处理任务。解决统计、累加类业务的例子。
- 【十分钟教会你汇编】MIPS编程入门
- 实践中如何优化MySQL(收藏)
- Framework掌握不全被面试官怼?Android字节跳动大牛的精编解析笔记带你系统学习!
- 路由策略中的IP-Prefix你了解多少?
- 路由策略——Route-policy
- 如何合理设置线程池大小
- 前端设计模式之责任链模式