2015-06-22 2 views
3

У меня есть холст, и я хочу изменить растровое изображение каждые 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); 

} 

Заранее благодарен.

+1

Вы должны объяснить, что именно не работает. – shmosel

ответ

4

Там есть несколько проблем:

Вы декодирование ресурсов снова и снова каждый раз. 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); 
+0

Большое спасибо! это сработало – Amit

0

Вы можете использовать этот link 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 метод

Смежные вопросы