我已经开始冒险尝试一些Canvas的东西并设法为它添加一些statis PNG文件。
现在我想加载一个PNG序列,我相信它是一个AnimationDrawable(而不是Bitmap)
我已经为动画编写了XML文件,但后来我感到难过。
我找不到任何人将PNG序列添加到Canvas对象的示例。
答案 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();