Android:动画自定义视图

时间:2017-03-13 12:25:32

标签: java android android-layout animation android-animation

编辑2:新的官方培训指南

开发者网站发布了与UI相关的培训指南,这是索引:

  • 动画概述
  • 物业动画概述
  • 动画可绘制图形
  • 使用动画显示或隐藏视图
  • 使用动画移动视图
  • 使用投影动画移动视图
  • 使用缩放动画放大视图
  • 使用弹簧物理进行动画移动
  • 自动动画布局更新
  • 使用转换动画布局更改
  • 创建自定义过渡动画
  • 使用动画启动活动

如果您对以下任何一项感兴趣,请点击此链接: https://developer.android.com/training/animation/

编辑:答案总结

我找到了5种在Android中制作动画的方法:

  1. 使用Property Animation动态View属性,以平滑地更改rotationalphascale

  2. 帧动画AnimationDrawable):快速更改图片,使其看起来像动画

  3. 使用<{3}}随时间编辑向量VectorDrawable)和动画来设计图像。

  4. onDraw()上覆盖 View并在画布上绘画执行AnimatedVectorDrawable

  5. 使用Custom Drawing,从After Effects中复制动画。许多动画可在Lottie获得。

  6. 但是,Android也提供了一些内置工具,例如LottieFiles(可让您在共享Views的多个布局之间设置转换动画),{{ 3}}(这可以让您将ViewActivity传递到另一个scale等等。

    API 21 中添加了许多(如果不是全部)这些功能,请点击此处Scenes以获取更多信息。

    以下是一些有趣的动画文章/博客:

    最后,有几个有趣的工具:

    注意

    我知道Android提供了alpharotatetranslationPath等转换。

    实施例

    我想查看并比较两个例子。

    1 - 自定义视图动画

    例如,GitHubonline

    2 - 复杂视图动画

    例如,适用于Android的StackExchange App,登录屏幕动画(无法在其上找到视频,也没有检查iOS中的行为是否相同)。

    问题

    对于第一个示例,除了播放GIF之外,我无法想到任何其他方式,或者在很短的时间段后手动更改图像。

    我不认为是这种情况,这就是我想问的原因,(1)你知道它是怎么做的吗?

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

    除了上面提到的,(3)你知道其他播放动画的技巧吗? (例如答案中提到的{{1}} - - )

    请分享!谢谢。

4 个答案:

答案 0 :(得分:10)

“填满一杯水”动画直接鼓励通过帧动画实现,即一个接一个地改变图片。 Here你可以看到一篇很好的博客文章,描述如何实现这种动画,这与你提到的“填满一杯水”基本相同:

enter image description here

乍一看,其他动画看起来有些困难。

enter image description here

但是在打开“Show layout bounds”之后你可以看到那里没有魔法。基本上这只是一个翻译动画,它将视图从一个位置转换为另一个位置。在该动画的情况下,困难的部分是实现找到平移坐标的算法。之后,通过scene transition 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

Transitions框架将为您完成剩下的工作。它会找到delta并为您执行动画。 Here你会在Lucas Rocha找到一篇很好的文章。

答案 1 :(得分:6)

  

你知道其他播放动画的技巧吗?

在Android中,您基本上有3种方法可以实现动画:

  • 仅使用view.startAnimation(...)
  • 为视图设置动画(缩放,Alpha,旋转等)
  • 为Drawable设置动画(根据Drawable,这可能是从动画矢量drawables到frame animations
  • 进行自定义绘图和动画

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

你提到了几天前刚出来的lottie。我们将看到它有多好,但它看起来非常有前景。在引擎盖下,lottie将解析json并使用CanvasPath(上面的第3个子弹点)进行一些自定义绘图 如果你可以得到After Effects,这可能是最简单的&#34;复杂动画的解决方案(和跨平台!)

人们也开始分享动画,你可以在这里找到它们:
http://www.lottiefiles.com/

  

你知道它是怎么做的吗?

(1)视频看起来像是自定义绘图。

  • 绘制并填充Path水,在动画顶部时用一些波浪制作动画,并撒上一些白点。
  • 画出周围玻璃的形状

这将涉及创建一个自定义视图和/或可绘制和覆盖onDraw(Canvas) Path.lineTo以及一些弧形,立方体或四边形将做的诀窍......我也不是设计师也不是矢量专家:)

我不认为使用animated vector drawables可以很容易地实现这一点,但您可以通过应用路径变形动画来完成它。 (如果我没有记错的话,动画矢量绘图只支持21+)

(2)视频只是动画一个路径并摆动一个标志。这可以通过使用AnimatedVectorDrawables(例如this blog节目)并通过做出自定义绘图(并因此也支持前lolipop设备)通过动画路径来修剪路径开始/结束或再次实现,例如,使用PathMeasure.getSegment()连续制作路径动画。

正如azizbekians answer已经指出的(3)动画是第一种提到的动画,只是动画(移动和缩放)视图。

  

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

显然可以沿着路径移动视图,但是视图会移动,您仍然需要找到一种方法来绘制跟随它的路径,如上所述。

答案 2 :(得分:1)

我想建议一个我刚刚写过的图书馆(最近发布),它允许您创建自定义视图并为其添加动画。

您可以找到here和非常simple demo here。 虽然我的演示坦率地说并不令人印象深刻,但他们展示了图书馆的力量,最重要的是如何使用它。

适用于Android的TimeInterpolator及其任何子级(以及自定义的子级)。

动画完全使用Canvas绘制,唯一的区别是你可以获得一个动画值,它根据TimeInterpolator随时间变化。

您可以根据自己的意愿添加任意数量的动画,并相互独立地控制它们。最重要的是,您不仅限于绘制非动画内容。有一个专门的方法(onDrawStatics)。

答案 3 :(得分:-2)

对于您的自定义视图,我建议您标识要进行动画处理的属性。

让我们说一下ClockView,You After在OnDraw()中设置绘画,描边等等

您可能希望AsyncMethods / Runnables在后台连续更新属性,从而产生逐帧动画,但实际上并不是Fraame动画,因为您只动画视图的属性(向左转)和不是他提出框架

那里有几十个例子,你可以通过微笑谷歌搜索