我有一个画布,我希望每50毫秒更改一次位图图像。
基本上我想做的就像一个gif动画。
正如你所看到的那样,有4张图片,每隔50毫秒,我希望它能改变图像。
下面的代码不起作用,我不知道为什么。
protected void onDraw(final Canvas canvas) {
res = getResources();
image = BitmapFactory.decodeResource(res, R.drawable.image_1);
canvas.drawBitmap(image, 0, 0, paint);
new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.interrupted())
try {
Thread.sleep(50);
System.out.println("OK2");
time++;
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if (time == 1) {
image = BitmapFactory.decodeResource(res,
R.drawable.image_1);
canvas.drawBitmap(image, 0, 0, paint);
invalidate();
}
if (time == 2) {
image = BitmapFactory.decodeResource(res,
R.drawable.image_2);
canvas.drawBitmap(image, 0, 0, paint);
invalidate();
}
if (time == 3) {
image = BitmapFactory.decodeResource(res,
R.drawable.image_3);
canvas.drawBitmap(image, 0, 0, paint);
invalidate();
}
if (time >= 4) {
time = 0;
image = BitmapFactory.decodeResource(res,
R.drawable.image_4);
canvas.drawBitmap(image, 0, 0, paint);
invalidate();
}
}
});
} catch (InterruptedException e) {
}
}
}).start();
super.onDraw(canvas);
}
提前致谢。
答案 0 :(得分:4)
有几个问题:
您每次都在重复解码资源。 decodeResource
可能不够快,无法在50毫秒内加载图像。解码帧一次并将它们存储在一个数组中会更快。 e.g:
Bitmap images[4];
void loadFrames()
{
res = getResources();
images[0] = BitmapFactory.decodeResource(res, R.drawable.image_1);
images[1] = BitmapFactory.decodeResource(res, R.drawable.image_2);
images[2] = BitmapFactory.decodeResource(res, R.drawable.image_3);
images[3] = BitmapFactory.decodeResource(res, R.drawable.image_4);
}
每次调用onDraw()
时都会启动一个新线程,这意味着将创建数百个线程。相反,您应该只创建一次线程。在线程内部,递增计数器并将image
设置为正确的帧,然后调用invalidate:
Thread.sleep(50);
time = (time + 1) % 4;
image = images[time];
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
invalidate();
}
};
然后在onDraw()
内,使用当前图像绘制到画布上:
canvas.drawBitmap(image, 0, 0, paint);
答案 1 :(得分:0)