Android:animation自定义视图

编辑:答案总结

我发现了5种在Android中animation的方法:

  1. 使用“ 属性animation” Viewanimation的属性 ,以平滑地更改rotationalphascale等。

  2. 帧animation ( AnimationDrawable ):快速更改图片,使其看起来animation

  3. 使用vector ( VectorDrawable )devise图像,并使用AnimatedVectorDrawable随着时间的推移它们进行编辑来为它们设置 animation 。

  4. 覆盖 View上的onDraw() ,并通过在canvas上绘画来执行自定义绘图 。

  5. 使用Lottie ,从After Effects中复制animation。 LottieFiles提供了许多animation。

但是,Android也提供了一些内置工具 ,例如Scenes (可以让您在多个共享Views布局之间进行animation转换), Shared elements (可以让您将View从一个Activity传递到另一个Activity )等等

API 21中添加了许多(如果不是全部)这些function,请点击这里获取更多信息。

这里有一些有趣的文章/animation博客:

  • Google制作的网站上的一个子类别叫做material.io : 创意定制 。

  • 我们如何devise一个漂亮的animation :用animationvector来训练animation。

  • Android转换的工作原理

  • animation到无限 :蓝牙animation与vector

  • Android中的框架animation :通过图像旋转填充心脏。

最后,一些有趣的工具:

  • Mac工具在GitHub上录制Android屏幕。

  • video到GIF转换器在线 。


注意

我知道Android提供了诸如scalealpharotatetranslationtranslation

例子

有两个例子我想看看和比较。

1 – 自定义查看animation

例如, 填满一杯水或画一条路 。

2 – 复杂查看animation

例如,Android的StackExchange应用程序,login屏幕animation(无法find它的video,也没有检查,如果在iOS中performance相同)。

对于第一个例子,除了播放GIF或者在一段时间之后手动改变图像之外,我想不出任何其他的方式。

我不认为这是事实,所以我想问一下, (1)你知道它是如何做的吗?

关于第二个例子,我只想到了一个想法,那就是设置一个Path并通过在animate()之后以某种方式传递View相应地移动View(2)这可能吗?

除了上面提到的, (3)你知道其他的animation技巧吗? (如Scene transitions在答案中提到 ) –

请分享! 谢谢。

Solutions Collecting From Web of "Android:animation自定义视图"

“填满一杯水”animation就是直接通过框架animation来实现的,即一个接一个地变换图片。 在这里你可以看到一篇不错的博客文章,描述如何实现这种animation,基本上就像你提到的“填满一杯水”一样:

在这里输入图像说明

其他的animation乍看起来有些困难。

在这里输入图像说明

但打开“显示布局界限”后,你可以看到那里没有魔法。 基本上这只是一个翻译animation,翻译从一个位置到另一个位置的视图。 在这个animation的情况下,困难的部分是实现查找翻译坐标的algorithm。 之后,animation只是通过场景转换animation的几行代码。

 // assuming at this step all the views are at the initial position at x0, y0 TransitionManager.beginDelayedTransition(rootLayout); // here set view coordinates to x1, y1 - the final position 

转换框架将为您完成剩下的工作。 它会find三angular洲并为您执行animation。 在这里您可以findLucas Rocha的一篇不错的文章。

你知道其他技术来播放animation吗?

在Android中,基本上有3种实现animation的方法:

  • 通过使用view.startAnimation(...)来animation视图(缩放,alpha,旋转等view.startAnimation(...)
  • 对Drawable进行animation处理(取决于Drawable,这可以是从animation向量drawable到框架animation的任何东西)
  • 做自定义绘画和animation

显然,通过框架方法animation视图比创build一些可绘制的animation更容易,创build一些可绘制的(xml)比自定义绘制更容易。

你提到了几天前刚刚出来的lottie。 我们将看到它有多好,但看起来非常有希望。 在引擎盖下,lottie将parsingjson,并使用CanvasPath (上面的第三点)做一些自定义绘图
如果你能在After Effects上使用,这可能是复杂animation(和跨平台)的“最简单”解决scheme!

人们也开始分享animation,你可以在这里find它们:
http://www.lottiefiles.com/


你知道它是如何完成的吗?

(1)video看起来像他们做一些自定义绘图。

  • 绘制并填充一条水的Path ,在animation时用一些波animation顶部,并洒上一些白色斑点。
  • 画一个周围的玻璃的形状

这将涉及到创build一个自定义的视图和/或绘制和重写onDraw(Canvas) Path.lineTo以及一些弧,立方体或四将做的伎俩…我既不是devise师也不是vector专家:)

我不认为这很容易通过使用animationvector绘制 ,但你可以通过应用path变形animation来完成。 (如果我没有弄错的话,animationvectordrawables只支持21+)

(2)video只是一个道路的animation和摇摆的旗帜。 这可以通过使用AnimatedVectorDrawables(如本博客显示)和修剪path开始/结束或通过执行自定义绘图(因此也支持预处理器)来实现,例如使用PathMeasure.getSegment()连续地animation的path。

(3)animation,正如azizbekians所指出的那样,是第一种提到的animation,就是animation(移动和缩放)视图。


关于第二个例子,我只想到了一个想法,那就是设置一个Path,并通过在animate()之后以某种方式传递视图来相应地移动View。 (2)这可能吗?

沿着path移动视图显然是可能的,但是随后视图会移动,并且您仍然需要find一种方法来绘制跟随它的path,如上所述。

我想build议一个我刚刚写过的库(最近发表),它允许你创build自定义视图并为它们添加animation。

你可以在这里find它,并在这里一个非常简单的演示 。 虽然我的演示坦率地说不是那么令人印象深刻,但它们展示了图书馆的力量,最重要的是如何使用它。

它适用于Android的TimeInterpolator及其子任何(和自定义一样)。

animation是完全使用Canvas绘制的,唯一的区别在于你可以得到一个animation值,它根据TimeInterpolator随着时间而变化。

你可以添加尽可能多的animation,你想要的视图,独立控制他们。 最重要的是,你不限于绘制非animation的东西。 有一个专门的方法(onDrawStatics)。

对于你的自定义视图,我build议你确定你想要animation的属性。

让我们来说一个ClockView,你在OnDraw()设置paint,stroke等等之后,

您可能希望有AsyncMethods / Runnables在后台连续更新属性,导致逐帧animation,但实际上它不是Fraame Animation,因为您只animation了视图的属性(左转),而不是他镂空框架

有几十个例子,有了很less的谷歌search,你可以DIY