1

申し訳ありませんが、単純なタイマーの作成に関する数え切れないほどのチュートリアルを読んだ初心者です。問題を引き起こしているwhileループであることに気付くまで、なぜ機能しないのか疑問に思っていましたoOを削除しましたが、機能するのは1回だけですただし、ループを使用する必要があるため、動きが終了します:C

コードは次のとおりです。

old_x は ImageView の座標であり、new_x は onTouch イベントの座標です。おそらく問題は、それらを int としてキャストしているためですか? 何をする必要があるのか​​わからないので、うまくいきます助けてくださいO:

    while(old_x != new_x)
    {
        timedMoveIV(100);
        old_x = (int)img.getX();
    }

ループなしで実行すると機能するこのメソッドを呼び出します。

public void timedMoveIV(int time_ms)
{
    //sleep for time_ms milliseconds
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
         public void run() { 
            if(new_x > img.getX())
            {
            img.setX(img.getX() + 1);
            }
            else
            {
            img.setX(img.getX() - 1);   
            }
         } 
    }, time_ms);
}
4

1 に答える 1

5

あなたの主な問題は、ループが途切れないことです。そのため、ループは常に関数を実行しており、膨大な数の実行可能ファイルを投稿しています。

あなたがしたいのは、さらに100ミリ秒後に実行可能な呼び出し自体を行うことです。この例を見てください:

if(old_x != new_x)
    timedMoveIV(100);

ここでは、関数を1回呼び出すだけです。その後、投稿されたランナブルに、再度移動する必要があるかどうかを決定させます。

public void timedMoveIV(final int time_ms)
{
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
        public void run() 
        { 
            if(new_x > img.getX())
                img.setX(img.getX() + 1);
            else
                img.setX(img.getX() - 1); 

            // if not in position, call again
            if((int)img.getX() != new_x)
                timedMoveIV(time_ms); 
        } 
    }, time_ms);
}

一度停止する必要がありimg.getX() == new_xます。ただし、キャスト先に注意してintください。これを省略すると、宛先のピクセル内に入るときに振動が発生する可能性があります。

new_xこれは、がであると想定していintます。フロートの場合も、両方をintにキャストして比較するか、最小しきい値と比較する必要があります。たとえば、0.5違いが少ない場合は、「完了」として扱います。

于 2013-03-03T06:35:29.590 に答える