动画Android布局的问题;元素快速回到起始位置

时间:2012-11-12 22:21:20

标签: android animation relativelayout

我几天来一直在寻找这个问题的答案,虽然有些事情有点工作(而且大多数人都没有),我希望我能找到最好的做法我正试图做的事情。

我试图在我的应用中显示通知栏。理想情况下,它会从顶部向下滑动,同时移动布局中的其他元素以适应。以下是帮助:illustration

的说明

以下是布局的结构(为简洁起见,我稍微考虑一下):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">

    <!-- notification -->
    <RelativeLayout
        android:id="@+id/notification_bar"
        android:layout_width="match_parent"
        android:layout_height="40dip"
        android:background="@drawable/notification_background"
        android:visibility="visible">

    <!-- end notifcation -->    
    </RelativeLayout> 

    <!-- header -->
    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="47dip"
        android:layout_alignParentTop="true" >

        <ImageView
            android:id="@+id/header_bg"
            android:layout_width="match_parent"
            android:layout_height="47dip"
            android:src="@drawable/home_header" />

    <!-- end header -->    
    </RelativeLayout>

    <!-- buttons -->
    <LinearLayout
        android:id="@+id/buttons"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/footer"
        android:layout_below="@id/notification_bar"
        android:layout_gravity="center_horizontal">

        <ImageButton 
        android:id="@+id/button1"
        android:src="@drawable/button1"
        android:layout_width="86dip"
        android:layout_height="65dip"
        android:layout_weight=".4" />
    <ImageButton 
        android:id="@+id/button2"
        android:src="@drawable/button2"
        android:layout_width="98dip"
        android:layout_height="73dip"
        android:layout_weight=".2" />
    <ImageButton 
        android:id="@+id/button3"
        android:src="@drawable/button3"
        android:layout_width="86dip"
        android:layout_height="71dip"
            android:layout_weight=".4" />

<!-- end buttons -->
    </LinearLayout>

    <!-- footer -->

    <LinearLayout
        android:id="@id/footer"
        android:layout_width="match_parent"
        android:layout_height="76dip"
        android:layout_alignParentBottom="true"
        android:background="@drawable/home_footer" >

    <!-- end footer -->
    </LinearLayout>
</RelativeLayout>

主要问题: 首先,我为通知栏设置了动画。它移动,并在动画结束时,它快速回到原位。是的,我有fillAfter设置为true。它并没有什么不同。无论如何,应该移动的3个项目是可点击的,而且根据我的阅读,元素没有实际移动,他们只是看起来就像他们一样有

次要问题: 整个视图是一个RelativeLayout,但是这三个元素在一个LinearLayout集中,通过XML设置为layout_below通知栏。我曾希望转移通知栏会挤压这个LinearLayout,移动按钮以适应,但没有这样的运气。如果我必须将这三个元素转换为单独的动画,那很好。我已经尝试过了,但是他们遭受同样的反击&#34;快速回复&#34;发出通知栏。然而,我希望有一种更简单,更合乎逻辑的方法。

我发现了很多关于这个快照问题的帖子,但没有一个解决方案能够正常工作(或者对我有意义,给予一点菜鸟)。听起来像是需要在onAnimationEnd处理程序中发生的事情。我认为这是调整LayoutParams的一些方法,但我不知道在那里做什么或做什么。

我定位API 8(2.2),因此Honeycomb动画API无法提供帮助。我已经查看了NineOldAndroids,它看起来很有前途,但我认为 是使用原生API执行此操作的方法。

**如果我们可以让通知栏被解雇,那么奖励积分,一切都会回到原来的位置。

**更新:以下代码KIND OF有效**

以下是滑动通知栏的动画方法:

private void showNotification() {

    mNotificationBar.setVisibility(View.VISIBLE);

    Animation slideOut = AnimationUtils.loadAnimation(this,  R.anim.slide_notification_out);

    slideOut.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            // do nothing
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // do nothing
        }

        @Override
        public void onAnimationEnd(Animation animation) {
             // do SOMETHING
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mNotificationBar.getLayoutParams();
            params.addRule(RelativeLayout.BELOW, mHeader.getId());

            mNotificationBar.setLayoutParams(params);
            mNotificationBar.clearAnimation();

        }
    });

    mNotificationBar.startAnimation(slideOut);  
}

更改AnimationEnd上的LayoutParams会保留通知栏。并且,当动画完成时,按钮布局挤压以适应!但是,按钮布局不像通知栏那样平滑地动画,它只是在动画结束时捕捉到位。此外,通知栏也会在动画的最后跳转一点,我猜是因为正在重新绘制布局。太过分了,但到目前为止。

1 个答案:

答案 0 :(得分:0)

Snap back problem

您需要在最终位置定义要在布局中显示的通知。对于你,它可能是你在上面提到的LinearLayout中的第一项。然后,您将visibility设置为gone

最后你使用了一段类似于下面的代码(我用它来动画按钮进入屏幕):

private void buttonFadeOut() {
        linear_layout_buttons.startAnimation(AnimationUtils.loadAnimation(MyMapActivity.this, android.R.anim.slide_out_right));
        linear_layout_buttons.setVisibility(View.GONE);
}


private void buttonFadeIn() {
    if(linear_layout_buttons.getVisibility() == View.GONE){
        linear_layout_buttons.startAnimation(AnimationUtils.loadAnimation(MyMapActivity.this, R.anim.slide_in_right));
        linear_layout_buttons.setVisibility(View.VISIBLE);
    }
}

Squeeze problem

这个我从来没有尝试过动画,但你可以在相对布局中的每个项目中设置android:layout_weight="1.0",以便在它们之间平均分配可用空间(或者使用值来播放为每个人分配不同的空间。

问候。