0

我有两个 ImageViews 设置为全屏 320 x 480 的 Activity。

我需要播放动画,但在用完 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 进行游戏动画的文章后,我提出了这个想法,他们在其中移动单个图像并通过一个小窗口查看所需的帧。精灵不适合我的目的,太多的帧精灵表将是 135mb。

这些图像现在只有 480 x 150(每个 31-54KB 之间)而不是全屏。ImageView 高度设置为 fill_parent,ImageView 宽度设置为 wrap_content,因此它仍会自动缩放到不同的屏幕尺寸。

我发现现在文件要小得多,加载速度更快,现在接近可接受的动画帧速率。希望这对尝试同样事情的其他人有所帮助。

于 2012-11-28T07:55:05.093 回答