【问题标题】:Push above view up while animating slide up another view在动画向上滑动另一个视图时向上推视图
【发布时间】:2015-08-20 14:55:05
【问题描述】:

我的布局中有以下视图

<RelativeLayout
    android:id="@+id/wrapper"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true">

    <LinearLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true">

        <!-- some child views here -->

    </LinearLayout>

    <LinearLayout
        android:id="@+id/footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/header"
        android:visibility="gone">

        <!-- some other child views here -->

    </LinearLayout>    

</RelativeLayout>

包装器 RelativeLayout 与其父级的底部对齐。并且不显示初始页脚视图(View.GONE)。当点击页眉视图时,页脚应该显示给用户,并从屏幕底部向上滑动动画,当用户再次点击页脚时,页脚应该向下滑动到底部。当我在页脚视图上启动向上滑动动画时,它不会同时推动页眉视图和动画。如果我首先将页脚视图的可见性设置为 View.INVISIBLE,然后启动动画,页眉视图会立即向上推(不与动画或页脚视图一起),页脚视图会附带动画。

这里是调用动画的代码

footer.setVisibility(View.INVISIBLE);

Animation animation = AnimationUtils.loadAnimation(activity, R.anim.slide_up_from_bottom);
animation.setDuration(animDuration);
footer.startAnimation(animation);
footer.postDelayed(new Runnable() {
    @Override
    public void run()
    {
        footer.setVisibility(View.VISIBLE);
    }
}, animDuration);

这是动画文件内容:

如何让这个动画推动页眉视图,而页脚视图向上滑动?

希望我说清楚了。我想要的只是两个视图一起向上/向下移动。

如果我将动画应用于包装视图,那么它会从底部向上滑动(而不是从当前位置)。

【问题讨论】:

    标签: android android-layout android-animation


    【解决方案1】:

    如果您希望您的页眉与页脚动画一起推送,您可以手动执行如下操作

    public class MainActivity extends Activity {
    
    private LinearLayout header,footer;
    private RelativeLayout wrapper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        header = (LinearLayout) findViewById(R.id.header);
        footer = (LinearLayout) findViewById(R.id.footer);
        wrapper = (RelativeLayout) findViewById(R.id.wrapper);
    
        header.setOnClickListener(new View.OnClickListener() {          
            @Override
            public void onClick(View v) {
    
                if(footer.getVisibility() == View.VISIBLE){             
                    int footerHeight = footer.getMeasuredHeight();
                    float initialWrapperY = wrapper.getY();                 
                    ObjectAnimator oa=ObjectAnimator.ofFloat(wrapper, "y", initialWrapperY,initialWrapperY+footerHeight);
                    oa.setDuration(400);
                    oa.start();
                    oa.addListener(new AnimatorListenerAdapter() {
                        public void onAnimationEnd(android.animation.Animator animation) {
                            footer.setVisibility(View.INVISIBLE);
                        };
                    });
                }
                else{                   
                    final float initialWrapperY = wrapper.getY();           
                    footer.setVisibility(View.VISIBLE);
                    wrapper.setY(initialWrapperY);
                    ViewTreeObserver vto=wrapper.getViewTreeObserver();
                    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {                     
                        @Override
                        public boolean onPreDraw() {
                            wrapper.getViewTreeObserver().removeOnPreDrawListener(this);
                            final int footerHeight = footer.getMeasuredHeight();                            
                            ObjectAnimator oa=ObjectAnimator.ofFloat(wrapper, "y", initialWrapperY,(initialWrapperY-footerHeight));
                            oa.setDuration(400);
                            oa.start();
                            return true;
                        }
                    });
                }               
            }
        });
    }
    
    
    }
    

    【讨论】:

    • 我已经尝试了好几个小时。您的回答完美,非常感谢!
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多