将AnimationDrawable(PNG序列)添加到Canvas?

时间:2013-06-14 13:49:02

标签: android android-canvas animationdrawable

我已经开始冒险尝试一些Canvas的东西并设法为它添加一些statis PNG文件。

现在我想加载一个PNG序列,我相信它是一个AnimationDrawable(而不是Bitmap)

我已经为动画编写了XML文件,但后来我感到难过。

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

Canvas允许绘制线条/形状/位图。 你设法绘制了一个位图。 动画只是从它们中抽取一个位图。 Canvas对drawables没有任何作用。 逻辑既不与Canvas也不与drawables有关。

答案 2 :(得分:-1)

绘制第一帧,然后使用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();