布局儿童在动画后冻结

时间:2018-04-02 13:34:59

标签: android android-layout user-interface android-animation

我在屏幕上设置ConstraintLayout动画,然后返回屏幕。但是,在将ConstraintLayout动画回视图后,子元素(EditTexts和Button)将被冻结。

我相信这是因为布局只显示了自身的图像,背后是实际的元素。如何让布局“重绘”?

以下是此问题的示例:

enter image description here

这是我的代码:

slide_out_left.xml:

 <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="200" android:fromXDelta="0%" android:toXDelta="-100%"/>
    </set>

slide_in_left.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate android:duration="200" android:fromXDelta="-100%" android:toXDelta="0%"/>
</set>

查看代码:

public void slideCreateFormOutToLeft() {

    Animation slideOutLeft = AnimationUtils.loadAnimation(getActivityContext(), R.anim.slide_out_left);
    slideOutLeft.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            createTaskViewFormContainer.setVisibility(View.INVISIBLE);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
    createTaskViewFormContainer.startAnimation(slideOutLeft);
}

public void slideCreateFormInFromLeft() {

    createTaskViewFormContainer.setVisibility(View.VISIBLE);
    Animation slideInLeft = AnimationUtils.loadAnimation(getActivityContext(), R.anim.slide_in_left);
    slideInLeft.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });
    createTaskViewFormContainer.startAnimation(slideInLeft);

}

1 个答案:

答案 0 :(得分:1)

从此Android documentation

  

视图动画系统的另一个缺点是它只是   修改了绘制视图的位置,而不是实际的视图本身。对于   例如,如果你动画一个按钮在屏幕上移动,那么   按钮绘制正确,但您可以单击的实际位置   按钮不会改变,所以你必须实现自己的逻辑   处理这个。

因此createTaskViewFormContainer中的Buttons和EditTexts不在您的点击区域附近。这是ViewAnimation的一个问题,建议使用PropertyAnimation,如下所示:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;

createTaskViewFormContainer.animate().translationX(-screenWidth).start();

将视图带回来:

createTaskViewFormContainer.animate().translationX(0).start();