2015-01-14 6 views
9

ImageViewでAnimationDrawableを使用する方法のGoogle提供の例に従っていました。あなたはここでそれを見つけることができます:http://developer.android.com/guide/topics/graphics/drawable-animation.htmlAndroid:AnimationDrawableキャストエラー

imageView.setBackgroundResource(R.drawable.animation); 
AnimationDrawable animation = (AnimationDrawable)imageView.getBackground(); 
animation.start(); 

私はそれを実行すると、私はエラーを取得する:

java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable cannot be cast to android.graphics.drawable.AnimationDrawable 

Googleは、これは動作するはずと考えているようだが、あなたはAnimationDrawableにBitmapDrawableをキャストすることはできません場合、私はないですどのようにこれが動作するはずですか?

+0

post source for animation.xml。 – alanv

+0

これは問題ではありません。問題はGoogleのコードにあります。 BitmapDrawableをAnimationDrawableにキャストすることはできません。 – TheOneX

+0

animation.xmlでAnimationDrawableが定義されている場合、これはうまくいくはずです。 View.getBackground()は、バックグラウンドXMLリソースからロードされたドロアブルを返します。マニュアルが正しい。別の問題があるかもしれません。 – alanv

答えて

6

私はこの問題の解決方法を考え出しました。

imageView.setImageDrawable(getResource().getDrawable(R.drawable.animation); 
AnimationDrawable animation = (AnimationDrawable)imageView.getDrawable(); 
animation.start(); 

私はGoogleのドキュメントは、バックグラウンドを使用すると言う理由はわかりませんが、setImageDrawableとgetDrawable作品を使用しました。正直なところ、それは他の方法よりもこの方法でうまくいくと思うほうが意味があります。

2

私は同じ問題を抱えていました。私はこのスレッドが数ヶ月前だと知っていますが、多分誰かが私の経験について何を読むべきでしょう。

私は理由を知りませんが、アニメーションに使用している間、自分のピクチャ名に「_」のようなスペースマークを受け入れることはできません。私は "loading_frame1"のような名前を使用しています。

package com.justkidding.animation; 

import android.support.v7.app.ActionBarActivity; 
import android.graphics.drawable.AnimationDrawable; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ImageView; 

public class LoadingAnimation extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loading_animation);  
    } 

    @Override 
    public void onWindowFocusChanged (boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 

     ImageView animation = (ImageView)findViewById(R.id.aniimage); 
     animation.setBackgroundResource(R.drawable.loading_animation); 
     AnimationDrawable frameAnimation = (AnimationDrawable) animation.getBackground(); 
     if(hasFocus) { 
      frameAnimation.start(); 
     } else { 
      frameAnimation.stop(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.loading_animation, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 
LoadingAnimation.classリストを

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

    <item android:drawable="@drawable/loadingframe1" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe2" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe3" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe4" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe5" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe6" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe7" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe8" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe9" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe10" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe11" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe12" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe13" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe14" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe15" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe16" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe17" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe18" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe19" android:duration="100" /> 
    <item android:drawable="@drawable/loadingframe20" android:duration="100" /> 

</animation-list> 

そして、ここで:

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

    <item android:drawable="@drawable/loading_frame1" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame2" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame3" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame4" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame5" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame6" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame7" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame8" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame9" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame10" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame11" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame12" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame13" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame14" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame15" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame16" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame17" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame18" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame19" android:duration="100" /> 
    <item android:drawable="@drawable/loading_frame20" android:duration="100" /> 

</animation-list> 

後:

前に....私は "loadingframe1" のようなものに名前を変更し、それが動作します

1

Googleのコードが動作します。ここで私を導いた "キャストできない問題"は、注意を払っていなかったので、res.xmlの代わりにres.animにanimation.xmlを入れていたからです。

しかし、私はsetImageDrawableとgetDrawableの方がうまく機能することに同意します。