1

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

我正在尝试让通知栏显示在我的应用程序中。理想情况下,它会从顶部向下滑动,同时移动布局中的其他元素以适应。这里有一个插图来帮助:插图

这是布局的结构(为简洁起见,我取出了一点):

<?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,移动按钮以适应,但没有这样的运气。如果我必须将三个元素转换为单独的动画,那很好。我已经尝试过了,但是它们遇到了通知栏所遇到的同样的“回弹”问题。然而,我希望会有一种更简单、更合乎逻辑的方法。

我发现了很多关于这个快速恢复问题的帖子,但是没有一个解决方案非常有效(或者对我来说有意义,有点菜鸟)。听起来好像需要在 onAnimationEnd 处理程序中发生一些事情。我认为这是调整 LayoutParams 的问题,但我不确定在那里如何或做什么。

我的目标是 API 8 (2.2),所以 Honeycomb 动画 API 无济于事。我研究了 NineOldAndroids,它看起来很有希望,但我认为必须有一种方法可以使用本机 API 来做到这一点。

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

** 更新:以下代码类型的作品 **

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

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 可使通知栏保持在原位。而且,当动画完成时,按钮布局会挤压以适应!但是,按钮布局不像通知栏那样流畅地动画,它只是在动画结束时卡入到位。此外,通知栏在动画的最后也会跳动一点,我猜是因为布局正在重绘。如此接近,但到目前为止。

4

1 回答 1

1

Snap back problem

您需要在您希望它出现在布局中的最终位置定义通知。LinearLayout对你来说,它可能是你上面提到的第一项。然后你设置visibilitygone.

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

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"在相对布局中的每个项目中设置 ,以在它们之间平均分配可用空间(或使用值来为每个项目分配不同的空间)。

问候。

于 2012-11-12T23:42:43.323 回答