【问题标题】:Add AnimationDrawable (PNG Sequence) to Canvas?将 AnimationDrawable(PNG 序列)添加到画布?
【发布时间】:2013-06-14 13:49:01
【问题描述】:

我已经开始尝试一些 Canvas 的东西,并设法向其中添加了一些 statis PNG 文件。

现在我想加载一个 PNG 序列,我认为这是一个 AnimationDrawable(而不是位图)

我已经为动画编写了 XML 文件,但是我被难住了。

我找不到任何将 PNG 序列添加到 Canvas 对象的示例。

【问题讨论】:

    标签: android android-canvas animationdrawable


    【解决方案1】:

    这里是示例:

    public class MainActivity extends Activity {
    
        private static final int FRAME_DELAY = 200; // in ms
    
        private ArrayList<Bitmap> mBitmaps;
        private final AtomicInteger mBitmapIndex = new AtomicInteger();
        private View mView;
        private Thread mThread;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // load resources
            mBitmaps = new ArrayList<Bitmap>();
            for(int resId : new int[]{
                    // resource ids here
                    R.drawable.ic_launcher,
                    R.drawable.ddms_128,
                    R.drawable.ddms_icon
                    }){
                mBitmaps.add(BitmapFactory.decodeResource(getResources(), resId));
            }
    
            // create View and implement 'draw'
            ViewGroup root = (ViewGroup) findViewById(R.id.root);
            root.addView(mView = new View(this){
                @Override
                public void draw(Canvas canvas) {
                    canvas.drawBitmap(mBitmaps.get(Math.abs(mBitmapIndex.get() % mBitmaps.size())), 10, 10, null);
                    super.draw(canvas);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
    
            mThread = new Thread(){
                @Override
                public void run() {
                    // wait and invalidate view until interrupted
                    while(true){
                        try {
                            Thread.sleep(FRAME_DELAY);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            break; // get out if interrupted
                        }
                        mBitmapIndex.incrementAndGet();
                        mView.postInvalidate();
                    }
                }
            };
    
            mThread.start();
        }
    
        @Override
        protected void onStop() {
            mThread.interrupt();
            super.onStop();
        }
    }
    

    activity_main.xml:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
    </RelativeLayout>
    

    【讨论】:

      【解决方案2】:

      Canvas 允许绘制线条/形状/位图。 你设法画了一张位图。 动画只是从一堆中绘制一个位图。 Canvas 对可绘制对象没有任何作用。 逻辑与 Canvas 和可绘制对象无关。

      【讨论】:

      • 我明白你在说什么,但我只需要一个关于如何实现它的例子。我能够让这些动画在画布上播放是非常重要的。如果做不到这一点,OpenGl ES 是否能够接管 Canvas 的工作? (我目前正在显示使用 drawLine() 绘制的音频波形,然后需要处理动画绘图)
      【解决方案3】:

      绘制第一帧,然后使用Handler 发布延迟的Message,处理后移动到下一帧并调用invalidate()

      你需要做的是:

      第 1 步。覆盖VisualizerView.verifyDrawable(Drawable who)

      @Override
      protected boolean verifyDrawable(Drawable who) {
          return true;
      }
      

      步骤 #2。修改MainActivity.addAnimationRenderer()

      private void addAnimationRenderer() {
          final AnimationDrawable anim = (AnimationDrawable) getResources().getDrawable(R.drawable.png1);
      
          AnimationRenderer animRenderer = new AnimationRenderer(anim);
          mVisualizerView.addRenderer(animRenderer);
      
          anim.setCallback(mVisualizerView);
          mVisualizerView.post(new Runnable() {
              @Override
              public void run() {
                  anim.start();
              }
          });
      }
      

      第 3 步。修改AnimationRenderer:删除

      mBitmap.setCallback(null);
      mBitmap.start();
      

      【讨论】:

      • 嗯,好的。我对Android开发真的很陌生,所以我不知道你刚才说什么:)
      • 然后尝试谷歌搜索处理程序
      • 问题是,我希望能够使用 AnimationDrawable,据我所知,您不能将其添加到 Canvas。我可以执行以下操作吗? AnimationDrawable 到 ImageView,ImageView 到 Canvas?
      • 好的,请看 Drawable.draw() 方法,其他目的是在 Canvas 上绘图
      • 我认为您没有正确理解我的问题。您不能将 Drawable.draw() 与 AnimationDrawable 一起使用。我试过了,我用谷歌搜索。你不能这样做,它们是两种不同的东西。
      猜你喜欢
      • 2015-02-28
      • 2015-03-01
      • 2018-05-13
      • 2021-11-16
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多