2015-06-22 85 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正確的框架,然後調用無效:

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

您可以使用此鏈接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方法