Android:仿“某音”APP 多头像跳动动画+轮播动画+心跳动画+输入框抖动动画

2023-11-04 00:10

本文主要是介绍Android:仿“某音”APP 多头像跳动动画+轮播动画+心跳动画+输入框抖动动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 序言
  • 效果一:多头像动画
    • 效果展示
    • 1、跳动动画
    • 2、轮播动画
    • 多头像效果的使用
  • 效果二:(单头像)心跳动画——放大&缩小
    • 效果展示
    • Code
  • 效果三:(输入框)抖动动画
    • 效果展示
    • Code
  • GitHub

序言

  • 仿“某音”APP 多头像跳动动画+轮播动画+心跳动画+输入框抖动动画
    GitHub源码地址:https://github.com/sange93/CoolAnimator/
    实现逻辑比较简单,主要是细微之处调整比较费时间,有需要的童鞋可以拿去用。

效果一:多头像动画

效果展示

多头像动画

1、跳动动画

	/*** 启动多头像跳动动画*/private fun startPetHeadJumpAnim(animSet: ArrayList<ObjectAnimator>, imageViews: ArrayList<ImageView>, handler: Handler) {for (i in imageViews.lastIndex downTo 0) {val anim = ObjectAnimator.ofFloat(imageViews[i], "translationY", 0f, -30f, 0f)animSet.add(anim)anim.duration = 600when (i) {imageViews.lastIndex - 1 -> {anim.startDelay = 200}imageViews.lastIndex - 2 -> {anim.startDelay = 400}}if (i == imageViews.lastIndex) {anim.addListener(object : Animator.AnimatorListener {override fun onAnimationRepeat(animation: Animator?) {}override fun onAnimationEnd(animation: Animator?) {handler.postDelayed({for (an in animSet) {an.start()}}, 2000)}override fun onAnimationCancel(animation: Animator?) {}override fun onAnimationStart(animation: Animator?) {}})}anim.start()}}

2、轮播动画

	/*** 启动多头像位移动画*/private fun startPetHeadAlphaAnim(animSet: ArrayList<ObjectAnimator>, imageViews: ArrayList<ImageView>, handler: Handler) {var startX = 0fvar endX = 0ffor ((i, v) in (imageViews.lastIndex downTo 0).withIndex()) {// 第4个以后,把(显示的)第一个隐藏,后两个向前移动if (i > 2) {for (j in v + 3 downTo v + 1) {val anim = when (j) {v + 3 -> {startX = animPetPositionLeft//-150fendX = animPetPositionEnd//-180fval xA = PropertyValuesHolder.ofFloat("translationX", startX, endX)val alphaA = PropertyValuesHolder.ofFloat("alpha", 1f, 0f)ObjectAnimator.ofPropertyValuesHolder(imageViews[j], xA, alphaA)}v + 2 -> {startX = animPetPositionMiddle//-80fendX = animPetPositionLeft//-150fObjectAnimator.ofFloat(imageViews[j], "translationX", startX, endX)}v + 1 -> {startX = animPetPositionRight//-10fendX = animPetPositionMiddle//-80fObjectAnimator.ofFloat(imageViews[j], "translationX", startX, endX)}else -> null}if (anim != null) {animSet.add(anim)anim.duration = 900anim.startDelay = i * 600Lanim.start()}}}// 依次显示Viewwhen (i) {0 -> {startX = animPetPositionMiddle//-80fendX = animPetPositionLeft//-150f}1 -> {startX = animPetPositionRight//-10fendX = animPetPositionMiddle//-80f}in 2..imageViews.lastIndex -> {startX = 0fendX = animPetPositionRight//-10f}}val xA = PropertyValuesHolder.ofFloat("translationX", startX, endX)val alphaA = PropertyValuesHolder.ofFloat("alpha", 0f, 1f)val anim = ObjectAnimator.ofPropertyValuesHolder(imageViews[v], xA, alphaA)animSet.add(anim)anim.duration = 900//300anim.startDelay = i * 600L// 200anim.start()if (v == 0) {anim.addListener(object : Animator.AnimatorListener {override fun onAnimationRepeat(animation: Animator?) {}override fun onAnimationEnd(animation: Animator?) {handler.postDelayed({for (view in imageViews) {view.alpha = 0f}for (an in animSet) {an.start()}}, 2000)}override fun onAnimationCancel(animation: Animator?) {}override fun onAnimationStart(animation: Animator?) {}})}}}

多头像效果的使用

	override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_head_anim)// 三个头像val image3 = arrayListOf<Int>()image3.add(R.drawable.pic_1)image3.add(R.drawable.pic_2)image3.add(R.drawable.pic_3)val animSet3 = arrayListOf<ObjectAnimator>()val handler3 = Handler()initAnim(this, rlHead3, image3, animSet3, handler3)// 五个头像val image5 = arrayListOf<Int>()image5.addAll(image3)image5.add(R.drawable.pic_4)image5.add(R.drawable.pic_5)val animSet5 = arrayListOf<ObjectAnimator>()val handler5 = Handler()initAnim(this, rlHead5, image5, animSet5, handler5)}/*** 初始化动画*/private fun initAnim(context: Context,layout: RelativeLayout,images: ArrayList<Int>,animSet: ArrayList<ObjectAnimator>,handler: Handler) {layout.removeAllViews()animSet.clear()val ivList = arrayListOf<ImageView>()val isJumpAnim = images.size <= 3for (i in images.lastIndex downTo 0) {val iv = CircleImageView(context)val width = ConvertUtils.dp2px(30f)val lp = RelativeLayout.LayoutParams(width, width)// 是否为跳动 动画if (isJumpAnim) {iv.alpha = 1fwhen (i) {0 -> iv.translationX = AnimatorUtil.animPetPositionLeft//-150f1 -> iv.translationX = AnimatorUtil.animPetPositionMiddle//-80f2 -> iv.translationX = AnimatorUtil.animPetPositionRight//-10f}} else {iv.alpha = 0f}iv.layoutParams = lpiv.scaleType = ImageView.ScaleType.CENTER_CROPiv.borderColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)iv.borderWidth = ConvertUtils.dp2px(1f)iv.setImageResource(images[i])layout.addView(iv)ivList.add(iv)}AnimatorUtil.startPetHeadAnim(animSet, ivList, handler)}

如果动画用于RecycleView 列表,适配item复用机制,可以在Adapter中增加以下代码,通过handler和animSet控制动画的开启和取消。

override fun onViewAttachedToWindow(holder: MyViewHolder) {super.onViewAttachedToWindow(holder)for (anim in holder.animSet) {anim.start()// 启动动画}}override fun onViewDetachedFromWindow(holder: MyViewHolder) {clearAnimSet(holder)}override fun onViewRecycled(holder: MyViewHolder) {// 清除动画clearAnimSet(holder)super.onViewRecycled(holder)}/*** 清空动画集*/private fun clearAnimSet(holder: MyViewHolder) {holder.handler.removeCallbacksAndMessages(null)for (anim in holder.animSet) {anim.pause()}}

效果二:(单头像)心跳动画——放大&缩小

效果展示

心跳动画

Code

	/*** 启动放大的心跳动画*/fun startEnlargeHeart(imageView: ImageView) {val anim = imageView.animate()anim.scaleX(2.0f).scaleY(2.0f).setInterpolator(AccelerateInterpolator()).setDuration(200).setListener(object : Animator.AnimatorListener {var tag = trueoverride fun onAnimationRepeat(animation: Animator?) {}override fun onAnimationEnd(animation: Animator?) {if (tag) {anim.scaleX(1.0f).scaleY(1.0f).setInterpolator(DecelerateInterpolator()).setDuration(400).startDelay = 0} else {anim.scaleX(2.0f).scaleY(2.0f).setInterpolator(AccelerateInterpolator()).setDuration(400).startDelay = 2000}tag = !tag}override fun onAnimationCancel(animation: Animator?) {}override fun onAnimationStart(animation: Animator?) {}}).startDelay = 1000}

效果三:(输入框)抖动动画

效果展示

抖动动画

Code

	/*** 启动抖动提示动画(如 EditText为空时 抖动效果)*/fun startErrorAnim(view: View){view.startAnimation(AnimationUtils.loadAnimation(App.instance, R.anim.shake_anim))}

shake_anim.xml

<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromXDelta="0"android:toXDelta="10"android:duration="300"android:interpolator="@anim/cycles_anim" />

cycles_anim.xml

<?xml version="1.0" encoding="utf-8"?><cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"android:cycles="2" />

GitHub

  • 仿“某音”APP 多头像跳动动画+轮播动画+心跳动画+输入框抖动动画
    GitHub源码地址:https://github.com/sange93/CoolAnimator/

这篇关于Android:仿“某音”APP 多头像跳动动画+轮播动画+心跳动画+输入框抖动动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341852

相关文章

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo