文章目录

  • 使用方法
    • 导入依赖
    • 调用
  • 原理分析
  • 限制与todo
    • 限制
    • Todo
      • 支持Dialog等非Activity
      • 动画方向多样
      • 每一个元素样式多样

该动画效果灵感来源于《复仇者联盟3》里灭霸打完响指之后,复仇者们消失的场景。


下面看下我们自己实现的效果:


这里不是只对ImageView做了动画,而是对包含ImageView的父view做动画。
该动画可用在绝大部分view和viewgroup上,上面的例子就是对Recyclerview中的Item做了动画。
已经将该动画效果开源到了Github,并且可以通过gradle直接引用。

github地址

使用方法

导入依赖

在根目录的build.gradle文件下添加:

 allprojects {repositories {...maven { url 'https://jitpack.io' }}}

在app目录的build.gradle文件下添加:

 dependencies {implementation 'com.github.Brooks0129:ThanosSnap:v1.0'}

调用

Kotlin调用:

        val disappearView = DisappearView.attach(activity)disappearView.execute(view, duration = 4000, interpolator = AccelerateInterpolator(0.5f),needDisappear = true)

DisappearView.attach(activity)里应该传递一个activity实例。
调用disappearView.execute表示开始执行动画,下面解释各个参数的含义。

  • view,表示需要执行动画的view,可以是单个的view,也可以是viewgroup,没有限制
  • duration,表示动画执行的时间,可以不填,默认是4m
  • interpolator,动画插值器,可以不填,默认是AccelerateInterpolator(0.5f)
  • needDisappear,表示执行动画的时候,原view是否要消失,可以不填,默认消失

如果是java调用,可以选择相应的重载方法。

原理分析

首先获取要做动画的view的截图。

   private fun createBitmapFromView(view: View): Bitmap? {view.clearFocus()val bitmap = createBitmapSafely(view.width,view.height, Bitmap.Config.ARGB_8888, 1)if (bitmap != null) {synchronized(sCanvas) {val canvas = sCanvascanvas.setBitmap(bitmap)view.draw(canvas)canvas.setBitmap(null)}}return bitmap}private fun createBitmapSafely(width: Int, height: Int, config: Bitmap.Config, retryCount: Int): Bitmap? {try {return Bitmap.createBitmap(width, height, config)} catch (e: OutOfMemoryError) {e.printStackTrace()if (retryCount > 0) {System.gc()return createBitmapSafely(width, height, config, retryCount - 1)}return null}}

拿到对应的bitmap,然后将Bitmap添加到原view的位置,添加方法是找到id为Window.ID_ANDROID_CONTENTrootview,在rootview上添加一个新view,这个新view负责将bitmap画出来。
接下来是bitmap动画部分。
将Bitmap分成几十个小bitmap。

private fun generateElement(i: Int, j: Int, elementLen: Int, bitmap: Bitmap): Element? {val element = Element()element.row = ielement.col = jelement.x = i * elementLen + mRect.leftelement.y = j * elementLen + mRect.topelement.originX = element.xelement.originY = element.yif (element.x + elementLen <= mRect.right) {element.w = elementLen} else {element.w = mRect.right - element.x}if (element.w <= 0) {return null}if (element.y + elementLen <= mRect.bottom) {element.h = elementLen} else {element.h = mRect.bottom - element.y}if (element.h <= 0) {return null}element.alpha = 1Fval path = Path()path.moveTo(element.x.toFloat(), element.y.toFloat())path.rQuadTo((Random.nextInt(150)).toFloat(),(-Random.nextInt(150)).toFloat(),(100 + Random.nextInt(150)).toFloat(),(-100 - Random.nextInt(150)).toFloat())element.path = pathelement.bitmap = Bitmap.createBitmap(bitmap, i * elementLen, j * elementLen, element.w, element.h)return element}

每一个小bitmap在生成的时候都确定了当前的位置、透明度及运动轨迹。
最后我们根据属性动画,即可确定每一个bitmap当前的状态。

具体代码参见源码。

限制与todo

限制

DisappearView.attach(activity)只能传递一个activity,所以如果当前如果context不是activity,那么动画暂时无法支持。比如说在Dialog中。

Todo

支持Dialog等非Activity

动画方向多样

每一个元素样式多样

目前每一个运动的元素都是矩形,接下来会支持圆形和自定义图形。

Android炫酷消失动画-ThanosSnap相关推荐

  1. android炫酷的动画效果

    这段时间看到一些比较好看的android动画效果,下面我就给大家一些我比较喜欢的动画效果,并附上源码希望对你们有用处. 1.很简单却很酷的粒子破碎效果 介绍:  实现思路 1.新建一个 Bean Pa ...

  2. 如何利用 Android 自定义控件实现炫酷的动画?|CSDN 博文精选

    作者 | u012551350 本文精选自 CSDN 博客,已获作者授权 「知足常乐」,很多人不满足现状,各种折腾,往往舍本逐末,常乐才能少一分浮躁,多一分宁静.近期在笔者身上发生了许多事情,心态也发 ...

  3. android svg动画框架,Android实现炫酷SVG动画效果

    svg是目前十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有交互 ...

  4. android 天气动画,为app制作炫酷天气动画 – WeatherView

    WeatherView 从1.1.0版本开始这个库使用了一个不同的setter结构. WeatherView是一个为app制作一个炫酷天气动画的Android库. Setup Android Stud ...

  5. 一款炫酷Loading动画--加载失败

    简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分 ...

  6. 如何做一个炫酷的动画网站-css实现图片上下浮动效果

    目前网站制作技术已经非常成熟.所以要实现一个炫酷的动画网站还是非常容易,现在通过js和css就都能实现.直接css就能实现各种效果,下面我们来通过一个小动画看看如何用css来实现让你的网站图片上下浮动 ...

  7. 纯html+css炫酷地球仪动画效果

    纯html+css炫酷地球仪动画效果 <!DOCTYPE html> <html lang="en"> <head><meta chars ...

  8. 炫酷的动画特效—css3旋转立方球体

    炫酷的动画特效-css3旋转立方球体 想要实现旋转立方球体特效,以下的内容你不容错过. 要理解的知识点 形成一个3D空间: transform-style:preserve-3d (让父元素形成3D, ...

  9. unity 3D炫酷开场动画

    2015/07/07// ///by xbw /环境 unity 4.6.1/// 游戏之前播放一段炫酷的动画是不是很能增加吸引力: unity支持的视频格式有mov. mpg. mpeg. mp4. ...

最新文章

  1. 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
  2. Python 入门篇-用Notepad++编写出第一个python程序
  3. mysql 数据为空 none 网页显示空白_用python爬虫爬取股票数据
  4. mysql备份、导入、远程数据库设置
  5. 0x06 MySQL 单表查询
  6. 一点一点看JDK源码(二)java.util.List
  7. 系统集成Nacos和Feign
  8. python 对excel操作用法详解_Python对excel文档的操作方法详解
  9. Android RootTrustManager 证书校验简单分析
  10. 数字金字塔MySQL存储过程_千金良方——MySQL性能优化金字塔法则
  11. IT服务器台账系统,it项目管理信息系统
  12. HDU2030-汉字机内码
  13. ubuntu无法进入图形界面,开机重复进入gun grup
  14. 部署Unbound实现DNS服务
  15. 一种简单、安全的Dota全图新思路 作者:LC
  16. c#中https通讯如何添加证书
  17. Python:后缀为whl的文件是什么?如何安装whl文件?
  18. 一次ajax多次回调结果,使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享...
  19. [Ajax]异步的 JavaScript 和 XML:Ajax入门教程(整理)
  20. 词干抽取java实现_LinkedIn文本分析平台:主题挖掘的四大技术步骤

热门文章

  1. 基于HT9032C的新型来电显示器设计
  2. java cms视频_【视频+源码】JAVA CMS系统项目实战
  3. 湖仓一体技术解读|实时对客释放全量数据价值
  4. python面向对象编程教程入门_python入门教程09-01 (python语法入门之面向对象编程)...
  5. Android Bmob的注册与登录案例
  6. Jenkins 自动化部署
  7. 游戏到底哪里吸引我?
  8. 【操作系统】FIFO算法
  9. 单点登录(一)—— 单点登录及常见解决方案原理(CAS、oauth2、JWT)
  10. 20170406 水哥