2015-06-22 4 views
0

Я пытаюсь образами петель в полотне (Расширяет вид класс) для создания анимации (Как GIF One), но он держит отставание и заикание моего приложения ...изображение Петли на холсте

Например:

public PlayView(Context context) { 
     super(context); 
     loadFrames(); 
     this.context = context; 

    } 

    protected void onDraw(final Canvas canvas) { 

    canvas_main = canvas; 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (!Thread.interrupted()) 
       try { 
        Thread.sleep(10); 
        time = (time + 1) % 4; 
        image = images[time]; 
        ((Activity) context).runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          invalidate(); 
         } 
        }); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
     } 
    }).start(); 

    if (image != null) { 
     System.out.println("Image is not null!"); 
     if (!right_Clicked) { 
      canvas_main.drawBitmap(image, width/2, 
        height - (image.getHeight() + image.getHeight()/2), 
        paint); 

     } 


    super.onDraw(canvas_main); 

} 

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

Как я могу обойти образы, чтобы создать анимацию без задержек и заиканий?

+0

Вы создаете новую нить при каждом обращении к виду. Вероятно, вы создаете тысячи потоков, которые пытаются рисовать изображения. – dharms

+0

Итак, я сохраню этот код как обычно, но удаляю только поток? –

+0

Вам нужна нить для анимации. Сохраните ссылку на него и проверьте, нет ли null, и только создайте его один раз. – dharms

ответ

0

Вот один из способов сделать это. Это хорошая идея, чтобы убить нить, когда вы покидаете Activity.

Thread mAnimationThread; 

protected void onDraw(Canvas canvas) { 

    super.onDraw(canvas); 

    // Not needed canvas_main = canvas; 

    if (mAnimationThread == null) { 

     mAnimationThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       while (!Thread.interrupted()) 
        try { 
         Thread.sleep(10); 
         time = (time + 1) % 4; 
         image = images[time]; 
         ((Activity) context).runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           invalidate(); 
          } 
         }); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
      } 
     }); 
     mAnimationThread.start(); 
    } 

    if (image != null) { 
     if (!right_Clicked) { 
      canvas.drawBitmap(image, width/2, 
        height - (image.getHeight() + image.getHeight()/2), 
        paint); 

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