2012-02-05 44 views
0

我試圖運行一個非常簡單的2D動畫,當我扔圖像視圖。我有2個活動涉及這個。onFling()2D動畫問題

的的GameCanvas

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) 
    {   
     if(GameWindow.getContext() == null) 
      return false; 

     if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom())) 
     {    
      try 
      {     
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false;    
       // right to left slap    
       if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)) 
       {         
        slappingLeft = true; 

        //Animate Slap     
        GameWindow.update();     

        if(!running) 
         running = true; 


       } 
       else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))    
       {  
        slappingRight = true; 

        //Animate Slap 
        GameWindow.update(); 

        if(!running) 
         running = true; 
       } 
      }     
      catch (Exception e)     
      {         
       //nothing         
      }    
     } 

     slappingLeft = slappingRight = running = false; 
     return true;    
    }  

而且GameWindow

private RefreshHandler mRedrawHandler = new RefreshHandler(); 

class RefreshHandler extends Handler 
{ 
    @Override 
    public void handleMessage(Message msg) { 
     GameWindow.this.update(); 
     GameWindow.this.invalidate(); 
    } 

    public void sleep(long delayMillis) { 
     this.removeMessages(0); 
     sendMessageDelayed(obtainMessage(0), delayMillis); 
    } 
}; 

public void update() 
{ 
    //animate slap     
    if(GameCanvas.slappingLeft) 
    {   
     for(int i = 0; i < 500; i+=100) 
     { 
      GameCanvas.SlapLeft();    
      mRedrawHandler.sleep(100);    
     } 
     GameCanvas.SetImage(); 
     //this.invalidate(); 
    } 
    else if(GameCanvas.slappingRight)       
    {   
     for(int i = 0; i < 500; i+=100) 
     { 
      GameCanvas.SlapImage(); 
      mRedrawHandler.sleep(100); 
     }  
     GameCanvas.SetImage(); 
     //this.invalidate(); 
    } 

} 

我將不勝感激,如果有人可以幫助我弄清楚這個問題了。我已經嘗試了許多不同的方法解決這個問題。

我只想顯示SlapImage半秒鐘,然後恢復到正常圖像,直到onFling再次被調用。

如果您想了解SetImage(),SlapLeft()和SetImage(),請告訴我!

非常感謝!

編輯

的GameCanvas不是畫布OBJ。它是setsContentView(R.layout.game_canvas)

GameWindow是一個自定義的ImageView

+0

你確定update()被調用嗎?睡覺似乎也沒有做任何事情。你可以看看http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html好像你正在重新發明輪子在這裏。 – schwiz 2012-02-05 21:53:15

+0

是的,正在調用更新。從sdk文件夾中的示例Snake遊戲中,它指出「創建一個我們可以用來引發動畫的簡單處理程序。我們將自己設置爲目標,並且可以使用sleep()函數來導致更新/無效在晚些時候發生。「我試圖這樣做。 – myselfesteem 2012-02-05 22:11:01

+0

但你已經註釋掉了sendMessagesDelayed(),所以它實際上並沒有做任何事情。 – schwiz 2012-02-06 03:30:09

回答

0

經過一番考慮,我決定實施這個解決方案。我認爲它工作得很好。

我還不確定爲什麼我以前的方式不起作用。如果有人願意詳細說明,我將不勝感激。

GameCanvas。我創建了這個線程。

resetSlap = new Thread() 
{ 
     public void run() 
     {   
      while(true) 
      { 
       try 
       { 
        Thread.sleep(500); 
        GameWindow.post(new Runnable() 
        { 
         public void run() 
         {       
          GameWindow.setImageBitmap(images[0]); 
          GameWindow.postInvalidate(); 
         } 
       }); 
       } catch (InterruptedException e) 
       {        
        e.printStackTrace(); 
       }         
      } 
     } 
    };   

Baiscally,每半秒我想將圖像重置回正常

然後在我寫

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) 
    {   
     if(GameWindow.getContext() == null) 
      return false; 

     if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom())) 
     {  

      try 
      {     
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false;    

       // right to left slap    
       if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) && 
         (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)) 
       {         
        slappingLeft = true; 

        //Animate Slap 
        SlapLeft(); 
        SlapSound(); 
        if(voice.nextInt(10) < 3) 
        { 
         Voice.start(); 
        } 

       } 
       // left to right slap 
       else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) && 
         (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))    
       {  
        slappingRight = true; 

        //Animate Slap 
        SlapImage(); 
        SlapSound(); 
        if(voice.nextInt(10) < 3) 
        { 
         Voice.start(); 
        } 
       } 
      }     
      catch (Exception e)     
      {         
       //nothing         
      }    
     } 

     slappingLeft = slappingRight = false; 
     return true;    
    } 

基本上OnFling,如果我被打耳光走了,我會叫拍擊離開並等待線程重置,如果我正確拍打,我會調用Slap Right並等待線程重置。

這個答案很適合我的情況。我希望這有助於:d

感謝大家的幫助。

0

的活動,我發現在你的代碼的問題。也許這是對結果的影響,但我不確定。問題是你應該在if語句中使用括號,因爲運算符& &比較運算符具有更高的優先級。所以,你的代碼應以下列方式:

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) 
    {   
     if(GameWindow.getContext() == null) 
      return false; 

     if((e1.getY() >= GameWindow.getHeight()) && (e1.getY() <= GameWindow.getBottom())) 
     {    
      try 
      {     
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false;    
       // right to left slap    
       if((e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)) 
       {                             
        slappingLeft = true; 

        //Animate Slap     
        GameWindow.update();                  

        if(!running) 
         running = true; 

        slappingLeft = false; 
       } 
       else if ((e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) && (Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY))    
       { 
        slappingRight = true; 

        //Animate Slap 
        GameWindow.update(); 

        if(!running) 
         running = true; 

        slappingRight = false; 

       } 
      }     
      catch (Exception e)     
      {         
       //nothing         
      }    
     } 
     running = false; 
     return false;   
    } 

我不知道,如果你的代碼的邏輯此影響,但在我看來,是的。

+0

嘿Yury。我嘗試了你的建議,但它對我的代碼沒有影響。即使在你的建議之前,代碼仍然在執行,但我並沒有看到動畫運行。 – myselfesteem 2012-02-07 05:51:14

+0

對不起,我不知道你的代碼沒有執行的原因。這只是我的建議。也許你可以發佈你的項目的某個地方,我會試着去測試它。 – Yury 2012-02-07 09:10:07

+0

你需要多少錢?和idk我會發布它 – myselfesteem 2012-02-11 04:43:27