2011-12-28 1 views
2

저는 Android 애니메이션에 매우 이상한 문제가 있습니다. 많은 다른 접근법과 구성 요소를 시도했지만 여전히 설명을 찾을 수 없습니다.FrameLayout의 뷰를 신속하게 전환하고 애니메이션을 적용하면보기가 엉망입니다.

나는 뷰의 컨테이너 인 FrameLayout버튼을 가지고 있습니다.

FrameLayout이 한 번에 하나의보기를 표시해야하고, 나는 버튼을 클릭하면, 나는 표시 다른보기에 FrameLayout이 원하는, 그리고 보기에 애니메이션을 시작 FrameLayout에서이 제거됩니다.

여기서 구체성은 I 은 두 개의보기만을 사용하며이 두보기를 전환하려고합니다.

문제 :

내가 클릭을 중지 한 후 정말 빨리 버튼을 여러 번 클릭

는, 두 개의 뷰가 최고 떨어져 다른에서 동시에 하나에 표시됩니다, 그리고 사라지지 않습니다. 컨테이너는 여전히 하나의보기 만 포함하고 있습니다 ... 확실히 이상합니다!

error screenshot http://i.minus.com/jDXyvUsE1LCOx.png

나는 간단한 예제와 함께이 문제를 재현 할 수 있었다 :

public class TestAnimActivity extends Activity implements OnClickListener { 

private FrameLayout container; 

private TextView current; 
private TextView next; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    current = new TextView(this); 
    current.setText("View 1 YEAH"); 
    next = new TextView(this); 
    next.setText("  View 2 DOH"); 

    container = (FrameLayout) findViewById(R.id.container); 
    container.addView(current); 

    findViewById(R.id.button).setOnClickListener(this); 
} 

public void onClick(View v) { 
    Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
    current.startAnimation(outAnimation); 
    container.addView(next); 
    container.removeView(current); 

    TextView temp = current; 
    current = next; 
    next = temp; 
} 
} 

당신이 애니메이션은 이전 사람이 계속 실행되는 동안 뷰에서 시작, 그리고 그 길을 내가되고 볼 수 있듯이 어떻게 든 문제의 원인이 될 수 있습니다. 내가 애니메이션 관련 코드를 언급하는 경우

, 그것은 완벽하게 작동합니다 :

// Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
// current.startAnimation(outAnimation); 

내가보기를 재사용 중지하고 대신 새로운 뷰를 작성하는 경우, 그것은 또한 완벽하게 작동합니다 :

// next = temp; 
next = new TextView(this); 
next.setText("View: " + new Random().nextInt()); 

하지만 돈 ' 새로운보기를 만들고 싶지 않습니다 :-).

문제는 부모로부터이 뷰를 추가/삭제하는 동안 뷰에서 애니메이션을 여러 번 시작하는 것과 관련이있는 것으로 보입니다.

내가 먼저 ViewFlipper과 노력, 다음 ViewAnimator 후 안드로이드의 소스 코드를 고개를 수동으로 문제를 재현하는이 일을 끝났다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Click me fast" /> 

</LinearLayout> 

이 시간 내 주셔서 감사합니다

당신은 여기 내 main.xml에이며, 레이아웃이 직접 테스트 할 수있게하려면!

답변

5

마침내 문제를 해결할 수있는 방법을 발견했습니다.

ViewGroup에서보기를 제거하면이보기에서 실행중인 애니메이션이 있으면 자동으로 ViewGroup의 "사라지는 자식"목록에 추가됩니다.

우리는 ViewGroup에 삭제되었지만 사라지는 자식에있는 뷰를 ViewGroup에 추가하려고 할 때 문제가 발생한 것처럼 보였습니다.

그 문제를 해결하는 쉬운 방법있다 : viewGroup.clearDisappearingChildren(); 여기

onClick() 방법의 새로운 구현 될 것이다 : 응답에 대한

public void onClick(View v) { 

    next.clearAnimation(); 
    container.clearDisappearingChildren(); 

    Animation outAnimation = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); 
    current.startAnimation(outAnimation); 
    container.addView(next); 
    container.removeView(current); 

    TextView temp = current; 
    current = next; 
    next = temp; 
} 
+0

답변 해 주셔서 감사합니다. 갤러리를 업데이트 할 때와 비슷한 문제가 있었는데 포커스가있는 항목은 애니메이션을 사용하여 확장되었습니다. 그러나 갤러리를 업데이트 할 때마다 이전 이미지가 보입니다. – Steve

0

버튼을 빠르게 누르지 않고도 작동하고 애니메이션없이 작동하는 경우 애니메이션이 실제로 어떻게 작동하는지보실 수 있습니다.내 이해에서 애니메이션에 표시되는 것은 애니메이션을 적용한 View 개체와 별개입니다. 부모보기에서 추가 및 제거를 계속하는 대신 애니메이션보기를 시도 할 수 있습니다. 또는 뷰가 뷰의 팬텀 이미지를 제거 할 수있는 onAnimationEnd 메서드를 얻을 수없는 것처럼 들리므로 뷰를 제거하기 전에 애니메이션을 정리해야합니다 (애니메이션의 기본 동작 인 setFillAfter (false)).).

+0

감사합니다 :). 당신은 청소의 아이디어에 대해 꽤 옳았습니다. 그러나 청소해야 할 것은 용기의 사라진 아이들이었습니다. –

+0

좋은 일, 기꺼이 문제를 해결할 수 있습니다. –