【问题标题】:Changing bitmap image on loop循环更改位图图像
【发布时间】:2015-06-22 00:18:23
【问题描述】:

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

}

提前致谢。

【问题讨论】:

  • 你需要解释到底是什么不工作。

标签: java android bitmap


【解决方案1】:

有几个问题:

您每次都在一遍又一遍地解码资源。 decodeResource 可能不够快,无法在 50 毫秒内加载图像。将帧解码一次并将它们存储在数组中会更快。例如:

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);

【讨论】:

  • 非常感谢!它工作了
【解决方案2】:

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

    public void imageSlider(){
    HashMap<String,Integer> file_maps = new HashMap<String, Integer>();
    file_maps.put("Palava Titans - Lodha Palava, Dombivali",R.drawable.img1);
    file_maps.put("Dribble Football -Imax, Wadala",R.drawable.img2);
    file_maps.put("Astro Park - Atria, Worli",R.drawable.img3);
    file_maps.put("TigerPlay - Citimall, Andheri w", R.drawable.img4);
    file_maps.put("DSF - Ryan International, Andheri", R.drawable.img5);
    file_maps.put("The Arena, Sakinaka", R.drawable.img6);
    file_maps.put("Astro Park - Smash, Lower Parel", R.drawable.img7);
    file_maps.put("DSF - Rcity, Ghatkopar", R.drawable.img8);
    file_maps.put("Father Agnel - Vashi", R.drawable.img9);
    file_maps.put("Footbrawl - Milan Subway", R.drawable.img10);

    for(String name : file_maps.keySet()){
        TextSliderView textSliderView = new TextSliderView(this);
        // initialize a SliderLayout
        textSliderView
        .description(name)
        .image(file_maps.get(name))
        .setScaleType(BaseSliderView.ScaleType.Fit);
        //add your extra information
        textSliderView.getBundle()
        .putString("extra",name);

        mDemoSlider.addSlider(textSliderView);
    }
    mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion);
    mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Right_Bottom);
    mDemoSlider.setCustomAnimation(new DescriptionAnimation());
    mDemoSlider.setDuration(5000);
}

在 onCreate 方法中调用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2020-06-17
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多