【发布时间】:2020-10-31 09:28:39
【问题描述】:
我正在努力弄清楚为什么没有从 View1 的顶部动画到 View1 的底部。动画时它从底部开始动画,我不知道为什么。
这是我的布局。
....
<View
android:id="@+id/view_reader"
android:layout_width="300dp"
android:layout_height="300dp"
android:background="@drawable/ic_view_finder"
app:layout_constraintBottom_toBottomOf="@+id/surfaceView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/scannerBar"
android:layout_width="280dp"
android:layout_height="2dp"
android:background="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="@+id/view_reader"
app:layout_constraintEnd_toEndOf="@+id/view_reader"
app:layout_constraintStart_toStartOf="@+id/view_reader"
app:layout_constraintTop_toTopOf="@+id/view_reader"
app:layout_constraintVertical_bias="0.0" />
...
所以我希望这个scannerBar 从 view_reader 的顶部开始动画,并在它到达 view_reader 的底部时重新开始。
我的动画如下:
val vto: ViewTreeObserver = binding.scannerBar.viewTreeObserver
val listener = ViewTreeObserver.OnGlobalLayoutListener {
val destinationScanView = (binding.viewReader.y +
binding.viewReader.height)
ObjectAnimator.ofFloat(
binding.scannerBar, "translationY",
binding.viewReader.y,
destinationScanView
).apply {
repeatMode = ValueAnimator.REVERSE
repeatCount = ValueAnimator.INFINITE
interpolator = AccelerateDecelerateInterpolator()
duration = 3000
}.start()
}
vto.addOnGlobalLayoutListener(listener)
我错过了什么?有没有比这更简单的动画视图的方法?
编辑
简单的问题:如何使用translationYscannerBar(View)从view_reader(View)的顶部到view_reader(View)的底部进行动画处理?
MotionLayout 更容易吗?
【问题讨论】:
-
请用更多代码和 xml 更具体地说明您的问题。我不确定您的问题是什么。
-
我只想将 scanBanner 视图从 view_reader 顶部动画到 view_reader 顶部
-
为什么不使用 Path() val path = Path().apply { arcTo(0f, 0f, 1000f, 1000f, 270f, -180f, true) } val pathInterpolator = PathInterpolator(path)
-
你能举个例子吗?我不熟悉 Path,如何将它分配给我的视图?
标签: java android kotlin android-animation android-motionlayout