【问题标题】:Layout children frozen after animation动画后冻结的布局子级
【发布时间】:2018-04-02 13:34:59
【问题描述】:

我正在将一个 ConstraintLayout 设置为关闭屏幕的动画,然后再返回屏幕。但是,在将 ConstraintLayout 动画化回视图后,子元素(EditTexts 和 Button)被冻结。

我相信这是因为布局只是展示了自身的形象,而实际的元素则在后面。如何让布局“重绘”?

这是一个问题的例子:

这是我的代码:

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);

}

【问题讨论】:

  • 你能在你的屏幕上给出一个完整的代码吗?我在上面测试过你的代码,没问题。顺便说一句,我怀疑您在“记录消息”弹出屏幕上设置了 INVISIBLE 而不是 GONE。
  • 真的吗?很想知道我做错了什么!我已将我的代码添加为要点,但这是一个很大的中间测试混乱。

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


【解决方案1】:

来自这个安卓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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多