web-dev-qa-db-ja.com

XMLファイルからAnimationDrawableをロードする方法

私はいくつかのカスタムクラスBitmapStorageを持っていますが、ビューなどには何もアタッチされていません。そして、アニメーションフレームを含む<animation-list>を含むborn_animation.xmlファイルがあります。

<animation-list oneshot="true" >
    <item drawable="@drawable/frame01" />
    <item drawable="@drawable/frame02" />
</animation-list>

Resourcesクラスを使用してxmlファイルからアニメーションをAnimationDrawableとしてロードし(すべての解析を行うため)、ビットマップを抽出してカスタムストレージクラスに配置します。

私が抱えている問題:

Resources res = context.getResources(); 
AnimationDrawable drawable = (AnimationDrawable)res.getDrawable(R.drawable.born_animation); 
assertTrue( drawable != null ); <= fails! it's null 

WTF?誰かが私にそれを説明できますか?コードは正常にコンパイルされます。すべてのリソースが用意されています。

別の方法を試しました-ImageViewを使用して解析を行います(開発ガイドで説明されているように)

ImageView view = new ImageView(context); 
view.setBackgroundResource(R.drawable.born_animation); 
AnimationDrawable drawable = (AnimationDrawable)view.getBackground(); 
assertTrue( drawable != null ); <= fails! it's null 

結果は同じです。 nullドローアブルを返します。

何かのヒントをいただければ幸いです。

15
dimsuz

はい、原因を見つけました! :)

それは私の悪かった:私のanimation.xmlファイルの適切なフォーマットを持っていなかった:

  • 私はAndroid:名前空間を属性で使用しませんでした(何らかの理由で、それは必須ではないと判断しました)
  • <item>タグの「duration」属性を削除しました

これらを修正した後、res.getDrawable()は正しいAnimationDrawableインスタンスを返し始めました。

Resources.NotFoundExceptionをより正確に調べる必要があり、何が問題かを見つけるのはgetCause()です:)

7
dimsuz

ドローアブル

<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android"   
                Android:id="@+id/myprogress" 
                Android:oneshot="false">
    <item Android:drawable="@drawable/progress1" Android:duration="150" />
    <item Android:drawable="@drawable/progress2" Android:duration="150" />
    <item Android:drawable="@drawable/progress3" Android:duration="150" />
</animation-list> 

コード:

ImageView progress = (ImageView)findViewById(R.id.progress_bar);
if (progress != null) {
    progress.setVisibility(View.VISIBLE);
    AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable();
    frameAnimation.setCallback(progress);
    frameAnimation.setVisible(true, true);
}

見る

<ImageView
  Android:id="@+id/progress_bar"
  Android:layout_alignParentRight="true"
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content"
  Android:src="@drawable/myprogress" />
28
Alex Volovoy

これは、「xml」ディレクトリからリソースをロードするために使用できます。

Drawable myDrawable;
Resources res = getResources();
try {
   myDrawable = Drawable.createFromXml(res, res.getXml(R.xml.my_drawable));
} catch (Exception ex) {
   Log.e("Error", "Exception loading drawable"); 
}
3
SpearHend