几天来我一直在寻找这个问题的答案,虽然有些事情有点工作(而且大多数都没有),但我希望我能找到我正在尝试做的事情的最佳实践。
我正在尝试让通知栏显示在我的应用程序中。理想情况下,它会从顶部向下滑动,同时移动布局中的其他元素以适应。这里有一个插图来帮助:插图
这是布局的结构(为简洁起见,我取出了一点):
<?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 可使通知栏保持在原位。而且,当动画完成时,按钮布局会挤压以适应!但是,按钮布局不像通知栏那样流畅地动画,它只是在动画结束时卡入到位。此外,通知栏在动画的最后也会跳动一点,我猜是因为布局正在重绘。如此接近,但到目前为止。