在循环上更改位图图像

时间:2015-06-22 00:18:24

标签: java android bitmap

我有一个画布,我希望每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);

}

提前致谢。

2 个答案:

答案 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)

您可以使用此链接here。这是用于滑动图像

xampp

在onCreate方法中调用它