經(jīng)常會遇到屏幕上的View位置更新的情況电谣,這時(shí)如果中間添加一些動畫,會顯得很自然并且很酷炫抹蚀,而不是硬巴巴的剿牺。
Android中,修改View的位置方式很多环壤,修改x晒来、y、params以及動畫之類的郑现。本文將介紹使用ObjectAnimator進(jìn)行View的移動湃崩。
使用ObjectAnimator改變View位置
ObjectAnimator類提供了很簡單的方式操作View的屬性,提供了靜態(tài)方法根據(jù)你想要操作的屬性生成ObjectAnimator實(shí)例接箫。因?yàn)橄胍苿覸iew的位置攒读,這里考慮View的屬性是translationX和translationY。
下面的例子將TextView在2s里從左向右移動了400像素辛友,代碼如下:
moveBtn.setOnClickListener {
ObjectAnimator.ofFloat(tvShow, "translationX", 400f)
.apply {
duration = 2000
start()
}
}
效果如下:
關(guān)于ObjectAnimator的介紹薄扁,后續(xù)將有文章詳細(xì)介紹剪返,敬請期待。在這之前邓梅,可以看官方文檔
添加彎曲動作
ObjectAnimator的使用很簡單脱盲,但是只提供了直線移動。使用彎曲動畫可以讓效果更生動日缨,更符合Google的Material Design钱反。
使用PathInterpolator
PathInterpolator是Android 5.0新加入的類,基于貝塞爾曲線或Path對象匣距。這個(gè)類指定彎曲動畫在一個(gè)1*1的正方形中面哥,并且錨點(diǎn)在(0,0)和(1墨礁,1),其他控制點(diǎn)則通過構(gòu)造方法傳入幢竹。 創(chuàng)建PathInterpolator的一種方式是創(chuàng)建Path對象,然后將它應(yīng)用于PathInterpolator上恩静。
比如:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val path = Path().apply {
arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true)
}
val pathInterpolator = PathInterpolator(path)
}
當(dāng)然焕毫,也可以通過在xml中定義PathInterpolator,比如:
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.4"
android:controlY1="0"
android:controlX2="1"
android:controlY2="1"/>
應(yīng)用給View驶乾,必須這么使用:
val path = Path().apply {
lineTo(400f, 0f)
moveTo(400f, 0f)
arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true)
lineTo(400f, 400f)
}
ObjectAnimator.ofFloat(tvShow, View.X, View.Y, path).apply {
duration = 2000
start()
}
效果如下:
可以看到邑飒,將根據(jù)Path定義的順序執(zhí)行。
關(guān)于官方代碼中下段代碼:
val animation = ObjectAnimator.ofFloat(view, "translationX", 100f).apply {
interpolator = pathInterpolator
start()
}
執(zhí)行后级乐,App將會崩潰疙咸,崩潰原因是Path must be start at(0,0)and end at(1风科,1)撒轮。
但是這樣的代碼是可行的。
val path = Path().apply {
cubicTo(0.2f,0f,0.1f,1f,0.5f,1f)
lineTo(1f,1f)
}
ObjectAnimator.ofFloat(tvShow, "translationX", 400f).apply {
duration = 2000
interpolator = PathInterpolator(path)
start()
}
或者這樣的Path贼穆,
val path = Path().apply {
lineTo(0.2f,0.2f)
moveTo(0.2f,0.2f)
lineTo(1f,1f)
}
當(dāng)動畫中使用了最后值時(shí)题山,這時(shí)Path必須得以(0,0)開始故痊,(1顶瞳,1)結(jié)束;而不規(guī)定結(jié)束值愕秫,那么就按照Path運(yùn)作的最后值停留慨菱。
系統(tǒng)默認(rèn)提供了三種PathInterpolator,分別是:
@interpolator/fast_out_linear_in.xml
@interpolator/fast_out_slow_in.xml
@interpolator/linear_out_slow_in.xml
參考: