如何为视图设置动画以向下滑动并向下推动其下方的所有内容?

时间:2017-10-19 06:18:13

标签: java android animation android-animation android-view

所以我已经研究了如何使用this thread设置动画淡化和下拉/滑动动画的动画效果,但它并没有像预期的那样完全正常工作。首先,这是我用于动画的代码:

public void toggleAdvancedVisibility(View text) { //text is a clickable textview thats acts as a toggle
    int dur = 1000;
    final View advView = findViewById(R.id.enc_advanced);
    if(advView.getVisibility() == View.GONE && animationDone) {
        advView.setVisibility(View.VISIBLE);
        advView.setAlpha(0.0f);

        //animate fade + drop down
        advView.animate()
                .setDuration(dur)
                .translationY(advView.getHeight())
                .alpha(1.0f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        animationDone = true;
                    }
                });
        animationDone=false;
    }
    else if(advView.getVisibility() == View.VISIBLE && animationDone) {
        //animate fade + slide up
        advView.animate()
                .setDuration(dur)
                .translationY(0)
                .alpha(0.0f)
                .setListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        advView.setVisibility(View.GONE);
                        animationDone = true;
                    }
                });
        animationDone = false;
    }
}

正如我所说,虽然有动画,但它没有像预期的那样接近任何行为。

问题#1 视图几乎被推出了可见性。我相信这是由于行.translationY(advView.getHeight()),好像我在动画之前将视图的位置设置为advView.setTranslationY(-advView.getHeight()),然后动画.translationY(0)它会转到应该的位置。< / p>

这个问题的一个明显问题是,当视图是动画时,视图在完成之前会与视图上方的视图“碰撞”。那么如何在不进入上方视图的情况下正确地向下/向上滑动呢?

问题#2 动画并没有完全“推”视图,这正是我的预期。我的意思是,动画视图下面也有一个视图。我希望下面的视图能够用动画视图向下推。虽然我还没有尝试过,但我认为这可以通过将相同的动画设置到它下面的视图来模拟,但还有另一种方法吗?

我对这个动画的东西很新,并且像这样操纵视图,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

我给你做了一个简短的例子,我看到它推动了视图的其余部分。 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.teststuff.MainActivity"
android:orientation="vertical">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/b1"
    android:text="show"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv1"
    android:text="Hello World!"
    android:visibility="gone"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!!!!"/>

这是.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tv1 = (TextView) findViewById(R.id.tv1);
    tv2 = (TextView) findViewById(R.id.tv2);
    b1 = (Button) findViewById(R.id.b1);

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (tv1.isShown()){
                tv1.startAnimation(slideInAnimation(view));
                tv1.setVisibility(View.GONE);
            }
            else {
                tv1.startAnimation(slideOutAnimation(view));
                tv1.setVisibility(View.VISIBLE);
            }
        }
    });


}

private TranslateAnimation slideOutAnimation(View view){
    TranslateAnimation animate = new TranslateAnimation(0,0,-view.getHeight(),0);
    animate.setDuration(500);
    animate.setFillAfter(false);
    return animate;
}
private TranslateAnimation slideInAnimation(View view){
    TranslateAnimation animate = new TranslateAnimation(0,0,0,-view.getHeight());
    animate.setDuration(500);
    animate.setFillAfter(true);
    return animate;
}

它适用于我。