2014-10-19 1 views
3

안녕하세요. 내가 시도하는 애니메이션에 문제가 있습니다.GONE에서 VISIBLE 로의 Android 가시성이 처음 작동하지 않습니다.

이 라이브러리 AndroidViewAnimations을 사용합니다.

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

그리고 여기 내 자바 코드 : 여기

내 레이아웃 XML 코드

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

지금 문제가 처음으로 내가, 애니메이션이 작동하지 않는 버튼을 눌러 것을하지만, 그 후에는 다른 모든 시간이 작동합니다.

나는 약간의 연구를했고 문제는 내가 가시성을 잃어 버렸고 내가 보이지 않게 설정했다면 처음부터 잘 작동한다는 것이다. 그 이유는 보이지 않는 가시성을 원하지 않지만 선형 레이아웃이 숨겨진 공간을 차지하기를 원하지 않기 때문입니다.

아이디어가 있으십니까?

+1

을했지만 어딘가 애니메이션을하기 전에 당신의 LinearLayout에 requestLayout()를 호출하려고합니다. 요요 코드가 있나요? 실제 코드를 보는 것은 좋을 것입니다. –

+0

예 requestLayout()을 시도했지만 작동하지 않았습니다. – user3596163

답변

5

난 그냥 전에 ViewTreeObserver를 사용하여 몇 분을 해결했다. 아래 예제에서 변수 currentMode은 애니메이션을 적용하려는 애니메이션입니다. 그것의 디폴트 값은 "없어졌다"그리고 나는 당신이 가지고 있었던 똑같은 문제를 가지고 있었다. 우리가 UI에 글로벌 변화를보고하고 반응 할 수있는 ViewTreeObserver를 사용

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

:

는 여기에 내가 그것을 해결 방법은 다음과 같습니다. View.isShown() 메서드는 해당 메서드가 표시되는지 확인합니다. 그렇다면 애니메이션을 시작합니다. 이것은 나를 위해 위대한 작품.

그런 다음 종료 애니메이션이 같은 아웃 애니메이션 리스너를 첨부해야합니다 :

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

당신은 제 영웅입니다. 당신을 투표 할 수 있기를 바랍니다. – user3596163

0

해결 방법 :

boolean firstTIme = true; 

(...) 

@Click 
void buttonDetails() { 
    // Checks Linear Layout Visibility 
    if (linearLayoutDetails.getVisibility() == View.GONE || firstTIme) { 
     firstTIme = false; 
     linearLayoutDetails.setVisibility(View.VISIBLE); 
     YoYo.with(Techniques.SlideInDown) 
       .duration(700) 
       .playOn(linearLayoutDetails); 
    } else { 
     linearLayoutDetails.setVisibility(View.GONE); 
    } 
} 
+0

미안하지만 어떻게 도움이 될까요? 부울 체크 만하면 코드의 나머지 부분은 광산과 같습니다. – user3596163

+0

처음 실행했을 때를 제외하고는 모든 것이 올바르게 작동한다고했습니다.내 부울 검사는 다음과 같이 극복합니다. firstTeam은 시작시 true이므로 if 문 안의 코드가 아무리 실행 되더라도 가시성에 대한 간단한 검사로 돌아갑니다. – nunoh123

+0

이제 오해가 발생한 곳을 봅니다. 문제는 코드가 실행되지 않는다는 것이 아닙니다. 이 코드는 항상 실행되지만 처음에는 Linear View 가시성이 사라지도록 설정된 경우 애니메이션이 작동하지 않습니다 (애니메이션이 보이지 않도록 가시성을 설정했기 때문에 가시성이 없어 렌더링되지 않을 것으로 생각되기 때문에). 선형 레이아웃이 렌더링되기 때문에 처음부터 잘되었지만 선형 레이아웃이 공간을 차지하고 있기 때문에 원하지 않습니다. – user3596163

0

당신이 유유 라이브러리는 다음이 시도 사용하는 경우.

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

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
         //this will do the trick 
         YoYo.with(Techniques.Landing) 
          .duration(1) 
          .playOn(view); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }) 
      .playOn(view); 

또한 어떤 뷰 객체에 연속 애니메이션이를 사용할 수 있습니다.

0

나는 비슷한 문제가 있었으며 허용 된 대답으로도 작동하지 못했습니다. 그래서 나는 내가 기대 아니에요이

TransitionInflater inflater = TransitionInflater.from(context); 
Transition transition = inflater.inflateTransition(R.transition.yoyo_transition); 
transition.addListener(new Transition.TransitionListener() { 
     ... 
     @Override 
     public void onTransitionEnd(Transition transition) { 
      do_stuff_with_yoyo(); 
     } 
     ... 
    }); 

TransitionManager.beginDelayedTransition((ViewGroup) getRootView(), transition); 
yoyo.setVisibility(View.VISIBLE); 

yoyo_transition.xml

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 

    <changeBounds android:duration="0"> 
     <targets> 
      <target android:targetId="@+id/yoyo_id"></target> 
     </targets> 
    </changeBounds> 

    <fade android:duration="0"> 
     <targets> 
      <target android:targetId="@+id/yoyo_id"></target> 
     </targets> 
    </fade> 

</transitionSet>