0

2つのImageViewがフルスクリーン320x480に設定されたアクティビティがあります。

アニメーションを再生する必要がありますが、VMが不足する前に、AnimateDrawableとxml配列を使用して再生するのに50を超えることができませんでした。

途中で他のことができるように、ループを使用してPNGを切り替えようとしています。たとえば、フレーム120、180、250などで振動し、フレーム400で別のアニメーションを再生します。

以下のこのコードは機能しますが、ImageViewがエミュレーターで更新されるまでに180〜280ミリ秒かかります。したがって、thread.sleepを280〜300より大きく設定する必要があります。そうしないと、フレームが欠落し始めます。imageviewを更新するためのより迅速な方法が必要です。より高速なウィジェットはありますか?

一部のフレームの画像は変更する必要がないか空白であるため、アニメーションが746フレーム続く間、実際に必要なのは245フレームだけです。そのため、drawablesフォルダーから変更されていないフレームまたは空白のフレームを削除しました。コードが見つからない場合は、それらをスキップします。これにより、すべての画像のサイズが合計9MBに縮小されました。

これは私の最初のAndroidアプリなので、正しく実行していない場合は申し訳ありません。改善方法についてアドバイスを差し上げます。:-)

誰かがこれを行うためのより良い方法を考えることができますか?ヘルプ!!(これと同じロジックがiPhoneでも正常に機能します)

activity_main.xml

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<ImageView
    android:id="@+id/background"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:scaleType="fitXY"
    android:src="@drawable/imgbackground"
    android:visibility="visible" />

<ImageView
    android:id="@+id/animLayer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:visibility="visible" />

</RelativeLayout>

MainActivity.java

package com.test.pngloop

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private static final String TAG = null;
    public int iFrameCount = 0;
    public ImageView myIV;
    public String myString;

    long startTime;
    long endTime;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
             //define the IV here so it's done only once
    myIV = (ImageView) findViewById(R.id.animLayer);
}

 @Override
 protected void onStart()
{
        super.onStart();
    Thread thr1 = new Thread(r1);
    thr1.start();
}


Runnable r1 = new Runnable() 
{
    public void run() 
    {
        while (iFrameCount< 747) 
        {
                  runOnUiThread(new Runnable() 
      {
          public void run() 
          {
              iFrameCount++;
        String image="image" + iFrameCount;
                    int resID = getResources().getIdentifier(image, "drawable", getPackageName()); 
              if (resID != 0)    //if there is no image/change for this frame skip it
              {
            myString="iFrameCount: " + iFrameCount;
            Log.d(TAG, myString);

                              //speed the same between setImageResource & setBackgroundResource
                  //myIV.setImageResource(resID);
                  //myIV.postInvalidate();

               startTime = System.currentTimeMillis();
                                 myIV.setBackgroundResource(resID);
                     endTime = System.currentTimeMillis();
                     System.out.println("setBackground took: " + (endTime - startTime) + " milliseconds");

              }
              else
              {  //we can skip frames 1-119, 209-251, 272-322, 416-472 & 554-745 (as no change from previous frame)
                myString="File skipped: " + iFrameCount;
                Log.d(TAG, myString);
              }

         }
     });

     try 
     {
         Thread.sleep(300);
     }
     catch (InterruptedException iex) {}

             }
          Log.d(TAG, "Finished playing all frames");     
         }
   };

}

4

1 に答える 1

0

オブジェクトに合わせて各画像 (アニメーションで使用) のサイズを最小の垂直ストリップに縮小することで、毎秒 20 フレーム近くまでフレーム レートを取得できるようになりました。

このアイデアは、Spritesheets をゲーム アニメーションに使用して、1 つの画像を移動させ、必要なフレームを小さなウィンドウから表示する方法について読んだ後に思いつきました。スプライトは私の目的には実用的ではありませんでした。フレームが多すぎて、スプライト シートが 135 MB になりました。

画像は全画面表示ではなく、480 x 150 (それぞれ 31 ~ 54 KB) になりました。ImageView の高さは fill_parent に設定され、ImageView の幅は wrap_content に設定されるため、さまざまな画面サイズに自動的にスケーリングされます。

ファイルがはるかに小さくなり、読み込みが速くなり、許容できるアニメーション フレーム レートに近づいていることがわかりました。これが同じことをしようとしている他の人の助けになることを願っています。

于 2012-11-28T07:55:05.093 に答える