onFling () Проблема 2D анимации - PullRequest
0 голосов
/ 06 февраля 2012

Я пытаюсь запустить очень простую 2D-анимацию, когда переворачиваю изображение. У меня есть 2 мероприятия, связанных с этим.

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 (), дайте мне знать!

Заранее большое спасибо!

EDIT

GameCanvas не является объектом Canvas. Это действие, которое устанавливаетContentView (R.layout.game_canvas)

GameWindow - это пользовательский ImageView

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

После некоторого рассмотрения я решил реализовать это решение. Я думаю, что это работает довольно хорошо.

Я все еще не уверен, почему мой предыдущий путь не сработал. Если кто-то еще хотел бы уточнить, я был бы признателен.

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

Тогда в OnFling я написал

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

По сути, если бы я шлепнул влево, я бы вызвал Slap влево и дождался бы сброса потока, а если бы я ударил вправо, я бы вызвал Slap Right и подождал, пока нить сбросится.

Этот ответ хорошо подходит для моей ситуации .. Надеюсь, это поможет: D

Спасибо всем за помощь.

0 голосов
/ 06 февраля 2012

Я нашел проблему в вашем коде.Может быть, это влияет на результат, но я не уверен.Проблема в том, что вы должны использовать скобки в своих операторах 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;           
    }

Я не знаю, влияет ли это на логику вашего кода, но мне кажется, что да.

...