从GONE到VISIBLE的Android可见性不适用于第一次

use*_*163 3 java animation android visibility view

您好,我尝试制作动画有问题.

我使用这个库AndroidViewAnimations.

这是我的布局xml代码:

    <Button
         android:id="@+id/buttonDetails"
         style="@style/Button_Details"/>

    <LinearLayout
        android:id="@+id/linearLayoutDetails"
        android:visibility="gone"
        style="@style/LinearLayout_Details">

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clmn_text"
            android:checked="true"/>
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clme_text"
            android:checked="true"/>
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clmn_text"
            android:checked="true"/>
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clmn_text"
            android:checked="true"/>
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clmn_text"
            android:checked="true"/>
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/checkbox_clmn_text"
            android:checked="true"/>

    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在这里我的java代码:

// Declare Variables
@ViewById
LinearLayout linearLayoutDetails;

@Click
void buttonDetails() {
    // Checks Linear Layout Visibility
    if (linearLayoutDetails.getVisibility() == View.GONE) {
        // Sets linearLayoutDetails Visibility to VISIBLE
        linearLayoutDetails.setVisibility(View.VISIBLE);
        // Makes Appear Animation
        YoYo.with(Techniques.SlideInDown)
                .duration(700)
                .playOn(linearLayoutDetails);
    } else {
        linearLayoutDetails.setVisibility(View.GONE);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我第一次按下按钮动画不起作用,但之后每隔一段时间都有效.

我做了一些研究,我发现问题是我的可见性设置已经消失,如果我将其设置为不可见,它从第一次开始工作正常.事实是,我不希望能见度变得不可见,但是因为我不希望线性布局在隐藏时占用空间.

有任何想法吗?

Don*_*ker 5

我刚刚使用ViewTreeObserver解决了几分钟前的问题.在下面的示例中,变量currentMode是我想要进出动画的视图.它的默认值是"消失了",而且我遇到了与你相同的问题.

这是我解决它的方式:

ViewTreeObserver vto = currentMode.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        if(currentMode.isShown()) {
            YoYo.with(Techniques.SlideInDown).duration(250).playOn(currentMode);
        }
    }
});
currentMode.setVisibility(mShouldShowMode ? View.VISIBLE : View.GONE);
Run Code Online (Sandbox Code Playgroud)

使用ViewTreeObserver,我们可以观察UI的全局更改,然后做出反应.该View.isShown()方法检查其是否可见.如果是这样,那么我然后开始动画.这对我很有用.

然后,对于退出动画,您必须将侦听器附加到out动画,如下所示:

YoYo.with(Techniques.SlideOutUp).duration(250).withListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {

    }

    @Override
    public void onAnimationEnd(Animator animation) {
        currentMode.setVisibility(View.GONE);
    }

    @Override
    public void onAnimationCancel(Animator animation) {

    }

    @Override
    public void onAnimationRepeat(Animator animation) {

    }
}).playOn(currentMode);
Run Code Online (Sandbox Code Playgroud)