我已经开始尝试一些 Canvas 的东西,并设法向其中添加了一些 statis PNG 文件。
现在我想加载一个PNG序列,我相信它是一个AnimationDrawable(而不是位图)
我已经为动画编写了 XML 文件,但后来我被难住了。
我找不到任何将 PNG 序列添加到 Canvas 对象的示例。
我已经开始尝试一些 Canvas 的东西,并设法向其中添加了一些 statis PNG 文件。
现在我想加载一个PNG序列,我相信它是一个AnimationDrawable(而不是位图)
我已经为动画编写了 XML 文件,但后来我被难住了。
我找不到任何将 PNG 序列添加到 Canvas 对象的示例。
这是示例:
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();
}
}
活动主.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>
Canvas 允许绘制线条/形状/位图。你设法画了一张位图。动画只是从一堆中绘制一个位图。Canvas 对可绘制对象没有任何作用。逻辑既不与 Canvas 相关,也不与可绘制对象相关。
绘制第一帧,然后使用 aHandler
发布延迟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();