2

给定一个始终对齐父底部的视图,最初高度为 0,我想对其进行动画处理,使其向上滑动到WRAP_CONTENT. 我正在使用布局转换来实现这一点:

viewGroup.layoutTransition.enableTransitionType(LayoutTransition.CHANGING)

viewGroup父母在哪里viewToAnimate并且有animateLayoutChange=true

逻辑是:

val params = viewToAnimate.layoutParams

if (expand && params.height == 0) {
   params.height = ViewGroup.LayoutParams.WRAP_CONTENT
   viewToAnimate.layoutParams = params
} else if (collapse && params.height != 0) {
   params.height = 0
   viewToAnimate.layoutParams = params
}

这在视图展开时效果很好;视图很好地从底部向上滑动到其高度。但是,当高度设置为 0 时,视图会简单地消失并且不会滑入。viewToAnimate是与 some 的相对布局TextViews,没有什么复杂的。任何建议,将不胜感激。

视频展示效果(注意文字没有下滑,只是消失了):https ://www.dropbox.com/s/1pq7yh0bqx8ghif/2017_10_06_23_17_11.mp4?dl=0

查看动画:

<RelativeLayout>

    ..some other stuff...

    <RelativeLayout
            android:id="@+id/viewToAnimate"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:gravity="center"
            android:layout_alignParentBottom="true"
            android:background="@color/white">

            <TextView
                android:id="@+id/sampleText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Sample Text"
                android:textSize="50sp"/>

    </RelativeLayout>

</RelativeLayout>
4

4 回答 4

2

将viewToAnimate布局高度保持为“ wrap_content ”,将 textView 高度保持为“0dp”。请参见下面的示例。

    <RelativeLayout
    android:animateLayoutChanges="true"
    android:id="@+id/viewToAnimate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:layout_alignParentBottom="true"
    android:background="@android:color/white">

    <TextView
        android:id="@+id/sampleText"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:text="Sample Text"
        android:textSize="50sp"/>

</RelativeLayout>


final RelativeLayout viewToAnimate = (RelativeLayout) findViewById(R.id.viewToAnimate);
    viewToAnimate.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);

            TextView sampleTV = (TextView)findViewById(R.id.sampleText);
            ViewGroup.LayoutParams params = sampleTV.getLayoutParams();
            if (params.height == 0) {
                params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            }else {
                params.height = 0;
            }

            sampleTV.setLayoutParams(params);

试着让我知道。

于 2017-10-13T10:16:35.603 回答
1

我对视图进行动画处理的方法是,如果视图要离开屏幕,我将 Visibility 属性设置为“不可见”,然后在动画开始时将其设置为“可见”当要在屏幕外设置动画时,我在动画结束时将其设置为“不可见”。

所以不要改变高度设置可见性。

if (expand) {
   viewToAnimate.setVisibility(View.VISIBLE);
} else if (collapse) {
   viewToAnimate.setVisibility(View.INVISIBLE);
}

在 xml 中设置可见性使用:

android:visibility="invisible"

希望这可以帮助。

澄清:

我正在使用自定义动画和 AnimationUtils.loadAnimation 来获取动画,而不是使用 setAnimationListener 来设置布局/查看要动画的内容的可见性。

例子:

 Animation animation = AnimationUtils.loadAnimation(this, R.anim.custom_animation_in_or_out_of_view);
 animation.setAnimationListener(new Animation.AnimationListener(){
            @Override public void onAnimationStart(Animation animation) {
                //should always be visible on animation starting
                viewToAnimate.setVisibility(View.INVISIBLE);
            }
            @Override public void onAnimationRepeat(Animation animation) {}
            @Override
            public void onAnimationEnd(Animation animation) {
                //set your viewToAnimate to the corresponding visibility...
            }
        });
 viewToAnimate.startAnimation(animation);

用于滑入视图的自定义动画 xml:

 <?xml version="1.0" encoding="utf-8"?>
 <translate
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:fromYDelta="0%p"
     android:toYDelta="100%p"
     android:duration="1000" />

并滑出视图,只需切换“fromYDelta”和“toYDelta”的值。

于 2017-10-16T14:43:36.507 回答
0

只需将其添加到您的 XML 中,它就可以完成工作。

android:animateLayoutChanges="true"

像那样

 <RelativeLayout>

        ..some other stuff...

        <RelativeLayout
                android:id="@+id/viewToAnimate"
                android:layout_width="match_parent"
                android:layout_height="0dp"
         *******android:animateLayoutChanges="true"********
                android:gravity="center"
                android:layout_alignParentBottom="true"
                android:background="@color/white">

                <TextView
                    android:id="@+id/sampleText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Sample Text"
                    android:textSize="50sp"/>

        </RelativeLayout>

    </RelativeLayout>
于 2017-10-16T13:53:00.227 回答
0

尝试使用对象动画师

        TextView sampleTV = (TextView) findViewById(R.id.sampleText);

    //initially translate the view to bottom
    sampleTV.setTranslationY(sampleTV.getHeight());

    // for sliding up
    sampleTV.animate().translationY(0).setDuration(100).setInterpolator(new AccelerateDecelerateInterpolator()).start();

    // for sliding down
    sampleTV.animate().translationY(sampleTV.getHeight()).setDuration(100).setInterpolator(new AccelerateDecelerateInterpolator()).start();
于 2017-10-16T12:54:29.517 回答