Android:动画自定义视图

Jon*_*ate 19 java animation android android-animation android-layout

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

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

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

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


编辑:答案总结

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

  1. 动画的性能View属性动画平滑地改变rotation,alpha,scale等.

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

  3. 使用矢量(VectorDrawable)设计图像,并通过AnimatedVectorDrawable随时间编辑它们来制作动画.

  4. 覆盖 onDraw() a View并通过在画布中绘制来执行自定义绘图.

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

但是,Android也提供了一些内置工具,例如Scenes(允许您在共享的几个布局之间设置转换动画Views),Shared elements(这可以让您将一个View从一个布局传递Activity到另一个布局)等.

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

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

最后,一些有趣的工具:


注意

我知道Android提供了转换,如scale,alpha,rotate,translation等.

例子

我想看两个例子并进行比较.

1 - 自定义视图动画

例如,填满一杯水画一条路.

2 - 复杂视图动画

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

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

我不认为是这种情况,这就是为什么我想问,(1)你知道它是如何完成的吗?

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

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

请分享!谢谢.

azi*_*ian 10

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

在此输入图像描述

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

在此输入图像描述

但在打开"Show layout bounds"之后,你可以看到那里没有魔法.基本上这只是一个翻译动画,它将视图从一个位置转换为另一个位置.在该动画的情况下,困难的部分是实现找到平移坐标的算法.之后动画只是通过场景转换动画的几行代码.

// 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
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*jak 6

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

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

  • 只需使用即可为视图(缩放,alpha,旋转等)设置动画 view.startAnimation(...)
  • 为Drawable设置动画(根据Drawable,这可以是从动画矢量绘图到帧动画的任何内容)
  • 做自定义绘图和动画

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

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

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


你知道怎么做的吗?

(1)视频看起来像是做了一些自定义绘图.

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

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

我不认为这可以通过使用动画矢量drawables轻松实现,但您可以通过应用路径变形动画来完成它.(如果我没有记错的话,动画矢量绘图只支持21+)

(2)视频只是动画一个路径并摆动一个标志.这可以通过使用AnimatedVectorDrawables(例如本博客显示)并通过动画路径进行自定义绘制(因此也支持前lolipop设备)来修剪路径开始/结束或再次实现,例如使用PathMeasure.getSegment()连续地为路径设置动画.

正如azizbekians回答的那样,(3)动画是第一个提到的动画,只是动画(移动和缩放)视图.


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

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