0

画像ビューをフリングするときに、非常に単純な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;            
    }       

そしてゲームウィンドウ

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を0.5秒間表示してから、onFlingが再度呼び出されるまで通常の画像に戻します。

SetImage()、SlapLeft()、およびSetImage()をご覧になりたい場合は、お知らせください。

よろしくお願いします!

編集

GameCanvasはCanvasobjではありません。そのアクティビティはContentView(R.layout.game_canvas)を設定します

GameWindowはカスタムImageViewです

4

2 に答える 2

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

これがあなたのコードのロジックに影響を与えるかどうかはわかりませんが、私にはそう思われます。

于 2012-02-06T17:26:22.133 に答える
0

いくつか検討した結果、このソリューションを実装することにしました。かなりうまく機能していると思います。

以前の方法がうまくいかなかった理由はまだわかりません。誰かがまだ詳しく説明したい場合は、いただければ幸いです。

ゲームキャンバス。このスレッドを作成しました。

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

基本的に、0.5 秒ごとに画像を通常の状態にリセットしたい

次に、私が書いた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 left を呼び出してスレッドがリセットされるのを待ち、右に叩いていた場合は Slap Right を呼び出してスレッドがリセットされるのを待ちます。

この答えは私の状況ではうまくいきます..これが役立つことを願っています:D

ご協力ありがとうございました。

于 2012-02-16T20:27:37.993 に答える