我几天来一直在寻找这个问题的答案,虽然有些事情有点工作(而且大多数人都没有),我希望我能找到最好的做法我正试图做的事情。
我试图在我的应用中显示通知栏。理想情况下,它会从顶部向下滑动,同时移动布局中的其他元素以适应。以下是帮助: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会保留通知栏。并且,当动画完成时,按钮布局挤压以适应!但是,按钮布局不像通知栏那样平滑地动画,它只是在动画结束时捕捉到位。此外,通知栏也会在动画的最后跳转一点,我猜是因为正在重新绘制布局。太过分了,但到目前为止。
答案 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"
,以便在它们之间平均分配可用空间(或者使用值来播放为每个人分配不同的空间。
问候。