【Animations】用动画移动视图(5)

原文

概要


屏幕上的对象通常需要重新定位。这可能是由于用户交互或在幕后完成某些处理而发生的。而不是立即更新对象位置,这会导致它从一个区域闪烁到另一个区域,您应该使用动画将其从开始位置移动到结束位置。

Android提供了允许您在屏幕上重新定位视图对象的方式,例如 ObjectAnimator。您可以提供您想要对象定位的结束位置以及动画的持续时间。您可以将它与时间插值器结合使用来控制动画的加速或减速。

使用ObjectAnimator更改视图位置


该ObjectAnimatorAPI提供了一种简单的方法来更改具有指定持续时间的视图的属性。它包含静态方法来创建实例,ObjectAnimator具体取决于您正在动画的属性类型。在屏幕上重新定位视图时,您将使用translationX和translationY 属性。

下面是一个ObjectAnimator在2秒内将视图从屏幕左侧移动到100像素的示例:

ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f);
animation.setDuration(2000);
animation.start();

此示例使用该ObjectAnimator.ofFloat() 方法,因为翻译值必须是浮动的。第一个参数是您想要制作动画的视图。第二个参数是您正在动画的属性。由于视图需要水平移动,因此translationX使用该属性。最后一个参数是动画的结束值。由于此值为100,因此屏幕左侧会显示许多像素。

下一个方法指定动画应以毫秒为单位的时间。在这个例子中,动画将运行2秒(2000毫秒)。

最后一个方法导致动画运行,它将更新视图在屏幕上的位置。

有关使用的更多信息ObjectAnimator,请参阅 使用ObjectAnimator进行动画处理。

添加弯曲的动作


虽然ObjectAnimator使用方便,但默认情况下,它将使用起点和终点之间的直线重新定位视图。材质设计不仅依赖于曲线,而且还依赖于屏幕上物体的空间移动。使用弧形运动可以帮助您的应用获得更多的材质感,同时让动画更有趣。

使用PathInterpolator

的PathInterpolator类是在5.0的Android(API 21)引入了新的内插器。它基于贝塞尔曲线或Path对象。该内插器在1x1平方中指定运动曲线,其中(0,0)和(1,1)处的定位点以及使用构造函数参数指定的控制点。PathInterpolator创建Path对象的一种方法是创建一个对象并将其提供给 PathInterpolator:

// arcTo() and PathInterpolator only available on API 21+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  Path path = new Path();
  path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true);
  PathInterpolator pathInterpolator = new PathInterpolator(path);
}

您还可以将路径插补器定义为XML资源:

<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:controlX1="0.4"
    android:controlY1="0"
    android:controlX2="1"
    android:controlY2="1"/>

一旦你创建了一个PathInterpolator对象,你可以将它传递给该Animator.setInterpolator()方法。然后,Animator将使用内插器确定启动时的时序或路径曲线。

ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 100f);
animation.setInterpolator(pathInterpolator);
animation.start();

定义你自己的路径
该ObjectAnimator班有新的构造函数,使您能够沿着使用一次两个或多个属性与路径沿着路径动画坐标。例如,下面的动画师使用一个Path对象来动画视图的X和Y属性:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  Path path = new Path();
  path.arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true);
  ObjectAnimator animator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
  animator.setDuration(2000);
  animator.start();
} else {
  // Create animator without using curved path
}

以下是弧形动画的样子:

如果您不想创建自己的时间或路径曲线,系统会为材料设计规范中的三条基本曲线提供XML资源:

  • @interpolator/fast_out_linear_in.xml
  • @interpolator/fast_out_slow_in.xml
  • @interpolator/linear_out_slow_in.xml

    Lastest Update:2018.04.23

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Animations】用动画移动视图(5)

猜你喜欢

转载自blog.51cto.com/4789781/2120977