2011-07-02 4 views
1

프레임 애니메이션을 정의하고 실행하지만 찾을 수있는 모든 샘플 코드를 시도했지만 이미지 뷰는 변경되지 않습니다. ImageView의 원본 Image가 유지됩니다.프레임 애니메이션이 실행되지 않습니다.

EDIT : 여러 번 시도해 본 끝에 에뮬레이터 대신 휴대 전화에서 APK를 실행했습니다. 내 휴대 전화에서 작동하지만 어떤 이유인지 에뮬레이터에서는 작동하지 않습니다.

답변

4

의 맨 아래에 있습니다 에.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final ImageView view = (ImageView) findViewById(R.id.shell); 
    view.setVisibility(ImageView.VISIBLE); 
    view.setBackgroundResource(R.drawable.animation_frame); 

    view.post(new Runnable(){ 

     public void run(){ 
     AnimationDrawable frameAnimation = (AnimationDrawable) view.getBackground(); 
     frameAnimation.start(); 
     } 
    }); 
    } 
} 

왜 이렇게해야하는지 알 수는 없습니다.

편집 :

final ImageView image1 = (ImageView) v.findViewById(R.id.coin1); 
image1.post(new Runnable() { 

     @Override 
     public void run() { 
      AnimationDrawable ani = (AnimationDrawable) image1.getBackground(); 
      ani.start(); 
     } 
    }); 

XML 레이아웃 :

 <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/coin" 
     android:id="@+id/coin1"/> 

동전 XML 여기 내 작업 프로젝트의 조각은 당신이 필요로하는 모든 것을 ... 자바

에서 onCreate에 있어야한다입니다 :

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> 
    <item android:drawable="@drawable/coin_spin_a" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_b" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_c" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_d" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_e" android:duration="100"/> 
    <item android:drawable="@drawable/coin_spin_f" android:duration="100"/> 
</animation-list> 
+0

코드를 사용하면 오류가 발생합니다. 14 행 : 새로운 Runnable() {}은 상속 된 추상 메소드를 구현해야합니다 Runnable.run(). Line16 : 토큰 "start"에 대한 구문 오류,이 토큰 다음에 식별자가 필요합니다. –

+0

@Miles O'Keefe 그 일은 유감스럽게 생각합니다. – schwiz

+0

이번에는 오류는 없지만 ImageView는 동일하게 유지됩니다. 이 코드가 효과가 있다면 작동중인 프로젝트를 업로드 할 수 있습니까? –

0

나는 그것에 대해서도 고심했다. 그것은 안드로이드 프레임 애니메이션 튜토리얼에서 설명하지만, "작은 글자"라고 말하자. 내가 거기에서 답을 복사하자 애니메이션 드로어 블 AnimationDrawable이 아직 완전히 부착되지 않기 때문에

그것은, 애니메이션 드로어 블 AnimationDrawable에서 호출 시작() 메소드는 액티비티의에서 onCreate() 메소드 중에 호출 할 수 없음을 유의하는 것이 중요합니다 창. 상호 작용을 필요로하지 않고 즉시 애니메이션을 재생하려는 경우 Activity에서 onWindowFocusChanged() 메소드를 호출하여 Android에서 윈도우를 포커스에 맞출 때 호출됩니다.

그것은 당신이에서 onCreate 스레드에서 애니메이션을 시작할 수없는 이유는, 그들이보기의 핸들러가 생성 된 어떤 스레드에 게시 할 필요가 정확하게 명확하지 않다 http://developer.android.com/guide/topics/graphics/view-animation.html#frame-animation

+0

나는 그 충고를 따랐지만 이미지는 동일하게 남습니다. 내가 추가했습니다 : TextView top = (TextView) findViewById (R.id.top); \t top.setText ("Started"); after frameAnimation.start(); 청취자가 실제로 방아쇠를 당겼 음을 테스트합니다. 텍스트가 "시작됨"으로 변경되었지만 이미지가 변경되지 않았습니다. –

+0

내가보기 엔 그것이 작동해야합니다. onWindowFocusChanged()에서 onCreate가 아닌 animation drawable을 설정할 수 있습니까? 차이는 있지만, 어쩌면 ... 그리고 코드가 여전히 작동하지 않는다면 다시 복사하십시오. –

0

schwiz 응답에 의견을 추가하고 싶습니다.

작업자 스레드에서 Handler.post를 호출하여 작업 할 수있었습니다. 아래는 샘플입니다.

public void onCreate(Bundle savedInstanceState) { 

    Thread t; 
    final ImageView activityIndicator; 
    final AnimationDrawable animiDrawable; 
    LinearLayout contentPlaceholder; 

    contentPlaceholder = (LinearLayout)this.findViewById(R.id.content_placeholder); 
    activityIndicator = new ImageView(this); 
    contentPlaceholder.addView(activityIndicator); 
    activityIndicator.setBackgroundResource(R.drawable.ic_activity_indicator_bar); 
    animiDrawable = (AnimationDrawable)activityIndicator.getBackground(); 

    t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      mCbt.mThreadHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        animiDrawable.start(); 
       } 
      }); 
     }; 
    }); 
    t.start(); 
} 
관련 문제