Android炫酷消失动画-ThanosSnap
文章目录
- 使用方法
- 导入依赖
- 调用
- 原理分析
- 限制与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_CONTENT
的rootview
,在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相关推荐
- android炫酷的动画效果
这段时间看到一些比较好看的android动画效果,下面我就给大家一些我比较喜欢的动画效果,并附上源码希望对你们有用处. 1.很简单却很酷的粒子破碎效果 介绍: 实现思路 1.新建一个 Bean Pa ...
- 如何利用 Android 自定义控件实现炫酷的动画?|CSDN 博文精选
作者 | u012551350 本文精选自 CSDN 博客,已获作者授权 「知足常乐」,很多人不满足现状,各种折腾,往往舍本逐末,常乐才能少一分浮躁,多一分宁静.近期在笔者身上发生了许多事情,心态也发 ...
- android svg动画框架,Android实现炫酷SVG动画效果
svg是目前十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有交互 ...
- android 天气动画,为app制作炫酷天气动画 – WeatherView
WeatherView 从1.1.0版本开始这个库使用了一个不同的setter结构. WeatherView是一个为app制作一个炫酷天气动画的Android库. Setup Android Stud ...
- 一款炫酷Loading动画--加载失败
简介 上一篇文章一款炫酷Loading动画–加载成功,给大家介绍了成功动画的绘制过程,这篇文章将接着介绍加载失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比较简单了. 动画结构分 ...
- 如何做一个炫酷的动画网站-css实现图片上下浮动效果
目前网站制作技术已经非常成熟.所以要实现一个炫酷的动画网站还是非常容易,现在通过js和css就都能实现.直接css就能实现各种效果,下面我们来通过一个小动画看看如何用css来实现让你的网站图片上下浮动 ...
- 纯html+css炫酷地球仪动画效果
纯html+css炫酷地球仪动画效果 <!DOCTYPE html> <html lang="en"> <head><meta chars ...
- 炫酷的动画特效—css3旋转立方球体
炫酷的动画特效-css3旋转立方球体 想要实现旋转立方球体特效,以下的内容你不容错过. 要理解的知识点 形成一个3D空间: transform-style:preserve-3d (让父元素形成3D, ...
- unity 3D炫酷开场动画
2015/07/07// ///by xbw /环境 unity 4.6.1/// 游戏之前播放一段炫酷的动画是不是很能增加吸引力: unity支持的视频格式有mov. mpg. mpeg. mp4. ...
最新文章
- 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
- Python 入门篇-用Notepad++编写出第一个python程序
- mysql 数据为空 none 网页显示空白_用python爬虫爬取股票数据
- mysql备份、导入、远程数据库设置
- 0x06 MySQL 单表查询
- 一点一点看JDK源码(二)java.util.List
- 系统集成Nacos和Feign
- python 对excel操作用法详解_Python对excel文档的操作方法详解
- Android RootTrustManager 证书校验简单分析
- 数字金字塔MySQL存储过程_千金良方——MySQL性能优化金字塔法则
- IT服务器台账系统,it项目管理信息系统
- HDU2030-汉字机内码
- ubuntu无法进入图形界面,开机重复进入gun grup
- 部署Unbound实现DNS服务
- 一种简单、安全的Dota全图新思路 作者:LC
- c#中https通讯如何添加证书
- Python:后缀为whl的文件是什么?如何安装whl文件?
- 一次ajax多次回调结果,使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享...
- [Ajax]异步的 JavaScript 和 XML:Ajax入门教程(整理)
- 词干抽取java实现_LinkedIn文本分析平台:主题挖掘的四大技术步骤