如何更新视图位于我正在制作动画的视图下方的位置?

时间:2014-04-11 14:28:03

标签: android

我正在制作一个视图firstView和secondView就在它下面。在firstView上我使用了对象动画师的属性'y'在y方向上移动但是当我动画时我希望第二个视图也随之移动因为它在下面firstView。我可以这样做吗?

我已经尝试过view.requestLayout()和view.invalidate()但它没有帮助。

这是我的布局 - :

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

         <View
         android:id="@+id/firstView"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="top"
         />
         <View    
         android:id="@+id/secondView"
         android:layout_below="@+id/firstView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
    />
</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

动画只能在视觉上移动视图。从逻辑上讲,视图仍然是动画开始时的位置,因此第二个视图永远不会向上移动,因为firsView在技术上从未移动过。

有两种方法可以处理此问题,具体取决于您希望在动画完成后视图的操作方式。如果动画视图中没有可单击的视图(按钮,图像等),则可以将翻译动画应用于firstView,将缩放动画应用于第二个视图。这将为您提供所需的效果。

但是,如果内部有可点击的视图,则可点击的区域不会受到动画的影响,并且会为分离的点击区域提供一些奇怪的用户体验。要处理这个问题,您需要创建自己的动画循环(在不同的线程上),并在每次迭代时更新firstView的边距。这将导致两个视图的物理位置随其内容一起变化。如果这是你需要的,我可以通过平滑的动画详细了解如何实现这一目标。

更详细的方法#2

要使用第二种方法,您需要从主线程创建自己的动画线程。我们不希望在动画期间阻止主UI线程。我将假设您希望在此示例中将整个视图移出屏幕。

final View firstView = findViewById(R.id.firstView);

new Thread() {

    public void run() {

        long startTime = System.currentTimeMillis();
        int duration = 500; // Make this whatever you want, in ms
        int finalY = -firstView.getHeight();
        double progress = 0;

        while (progress < 1) {

            progress = Math.min((System.currentTimeMillis() - startTime) / (double)duration, 1);

            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)firstView.getLayoutParams();
            params.topMargin = (int)(progress * (double)finalY);
            firstView.setLayoutParams(params);

            firstView.postInvalidate();

            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }

        }

    }

}.start();