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");
}
};
}