【发布时间】:2013-06-14 13:49:01
【问题描述】:
我已经开始尝试一些 Canvas 的东西,并设法向其中添加了一些 statis PNG 文件。
现在我想加载一个 PNG 序列,我认为这是一个 AnimationDrawable(而不是位图)
我已经为动画编写了 XML 文件,但是我被难住了。
我找不到任何将 PNG 序列添加到 Canvas 对象的示例。
【问题讨论】:
标签: android android-canvas animationdrawable
我已经开始尝试一些 Canvas 的东西,并设法向其中添加了一些 statis PNG 文件。
现在我想加载一个 PNG 序列,我认为这是一个 AnimationDrawable(而不是位图)
我已经为动画编写了 XML 文件,但是我被难住了。
我找不到任何将 PNG 序列添加到 Canvas 对象的示例。
【问题讨论】:
标签: android android-canvas animationdrawable
这里是示例:
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>
【讨论】:
Canvas 允许绘制线条/形状/位图。 你设法画了一张位图。 动画只是从一堆中绘制一个位图。 Canvas 对可绘制对象没有任何作用。 逻辑与 Canvas 和可绘制对象无关。
【讨论】:
绘制第一帧,然后使用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();
【讨论】: