有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在循环中更改位图图像

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

  1. # 1 楼答案

    有几个问题:

    您每次都在反复解码资源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);
    
  2. # 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方法中调用此函数