2014-09-30 5 views
1

아이콘을 다시 페이드 아웃시킨 다음 다시 꺼내야하는 매우 간단한 애니메이션을 만들었습니다.안드로이드 뷰는 페이드 아웃하지만 페이드 인하지 않습니다.

화면을 탭하면 아이콘이 50 밀리 초 이내에 페이드 아웃 한 다음 즉시 페이드 인하 고 다시 즉시 페이드 아웃 할 것으로 예상됩니다.

그러나 탭하면 아이콘이 사라지고 더 이상 아무것도하지 않습니다!

public boolean onTouchEvent(MotionEvent event) { 
     centralIcon = (ImageView) findViewById(R.id.centralIcon); 
     float fullAlpha = centralIcon.getAlpha(); 
     centralIcon.animate().setDuration(50); 
     centralIcon.animate().alpha(0); 
     centralIcon.animate().alpha(fullAlpha); 
     centralIcon.animate().alpha(0); 
     return true; 
    } 

왜 다시 퇴색하지 않을 것이다 : 여기

는 방법?

답변

1

당신이 지정한 것은 하나씩 차례로 발생해야하는 3 가지 애니메이션이지만 애니메이션을 코딩 한 방식으로 차례대로 발생하지는 않습니다. 모두 수행중인 것은 ViewPropertyAnimator와 관련된 것입니다. 알파 그래프를 3 번 ​​오버라이드 (alpha()를 호출하면 새로운 애니메이션이 생성되고 더 이상 알파 프라퍼티가 취소됨), 마지막 하나만 실행됩니다.

애니메이션 세트를 생성하고 이전 애니메이션이 끝난 후에 시작하도록 애니메이션을 오프셋해야합니다 (그리고 매우 짧기 때문에 50ms가 넘을 것입니다! 거의 눈에 띄지 않습니다).

이 코드는 작동합니다 :

AnimationSet a = new AnimationSet(true); 

    float fullAlpha = centralIcon.getAlpha(); 

    AlphaAnimation alpha[] = new AlphaAnimation[3];//array of 3 alpha animations 

    alpha[0] = new AlphaAnimation(fullAlpha, 0);//first fade to 0 
    alpha[0].setDuration(300); 

    alpha[1] = new AlphaAnimation(0, fullAlpha);//then fade back to full 
    alpha[1].setDuration(300); 
    alpha[1].setStartOffset(300);//start after alpha[0] finishes 

    alpha[2] = new AlphaAnimation(fullAlpha, 0);//then fade back to 0 
    alpha[2].setDuration(300); 
    alpha[2].setStartOffset(600);//start after alpha[0] and alpha[1] finish 

    for(AlphaAnimation current : alpha) 
     a.addAnimation(current);//add all the animations to the set 

    a.setInterpolator(new LinearInterpolator()); 

    centralIcon.setAnimation(a);//attach the animation set to the view 
    a.startNow();//start the animation set 
+0

오류는 없지만 작동하지 않습니다. 디버그 모드에서 화면을 탭하면 onTouch 메서드가 세 번 호출됩니다. – Raphi

+0

코드를 테스트하지는 않았지만 대부분 동의합니다. 그러나, 나는 이것이 4 개의 개별 애니메이션을 생성하고 최종 만이 실행될 것이라는 진술에 동의하지 않는다. 첫 번째 호출에서 설정된 기간은 다른 애니메이션, 특히 취소되지 않은 마지막 애니메이션에서 사용됩니다. –

+0

당신 말이 맞아요. googles sdk docs에서 animate() 호출을보고 뷰와 연결된 ViewPropertyAnimator를 반환합니다. 응답을 업데이트했습니다. – AndroidNoob

1

에서 : http://developer.android.com/reference/android/view/ViewPropertyAnimator.html

public ViewPropertyAnimator alpha (float value) 

추가 된 API 레벨 12 에서이 방법은보기의 alpha 속성이 지정된 값에 애니메이션 원인이됩니다. 이미 속성에서 실행중인 애니메이션은 취소됩니다.


일부 문제는 굵게 표시됩니다. 알파를 다시 호출하여 처음 두 알파 애니메이션을 즉시 취소합니다. (목표 알파 값을 변경하여이를 테스트 할 수 있습니다.) 이것이 사실이 아니더라도 애니메이션이 원하는 방식으로 작동 할 것으로 기대하는 것은 의미가 없습니다. animate(). alpha (value)는 사용자가 가정 한 것을 수행하지 않습니다.

50 밀리 초와 같은 기간 후에보기가 다시 페이딩을 시작하게하려면 지연을 어떻게 든 지정해야합니다. 이 순서를 만드는 방법에는 여러 가지가 있습니다. 예를 들어, 나중에 애니메이션 (AndroidNoob이 응답 함)에서 지정하는 오프셋을 사용하여 AnimationSet을 만들 수 있습니다. AnimationListener를 추가하여 애니메이션의 끝을 청취하여 다음을 시작할 수 있습니다. UI 스레드에서 일련의 애니메이션을 실행하는 다른 스레드를 만들 수 있습니다.

관련 문제