2016-12-30 6 views
2

タイトルはそれをすべて言います。無作為な可視性と不可視性の無限ループを見たいと思います。これは、私がそれに近づいた方法です: -プロセスを繰り返す:ランダムな時間のビューを表示し、ランダムな時間に見えないようにする

最初に、ランダム時間getRandomWaitTime()とgetRandomDisplayTime()を取得する2つのメソッドを作成しました。これらのメソッドはよく定義され、テストされ(ログで)、必要に応じて動作します。

fruit[0].postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       fruit[0].setVisibility(View.VISIBLE); 
       fruit[0].postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         fruit[0].setVisibility(View.INVISIBLE); 
        } 
       }, getRandomDisplayTime()); 
       fruit[0].postDelayed(this, getRandomWaitTime()); 
       } 
     }, getRandomWaitTime()); 

:これらの両方の方法は、今、私は[0]、最初にそれを設定するなど目に見えないし、次のコードが実行されることを次々ImageViewのフルーツを作成

getRandomWaitTime()  : 3000-6000 
getRandomDisplayTime() : 3000-5000 

として、ミリ秒でintとしてランダムな値を返しますコードがコンパイルされ、同様に実行され、ImageViewは可視性と不可視性の無限のサイクルを経ます可視または不可視に設定されている時間は最小値3000msを持たないようです時々、 500ミリ秒後に見えなくなった。私は、View.postDelayedの代わりにHandler.postDelayedを使用するなどのようなものを試しましたが、これはうまくいかないようです。私は活動が始まり、3000

のような定数で、その後postDelayedメソッドからのすべてのgetRandomWaitTime()getRandomDisplayTime()方法を取り外して交換するとき

興味深いことが起こります。最初にフルーツ[0]は不可視に設定されています。 3000ms後、それは見えて来てはそこにとどまる。それ以降は何も起こりません。不可視に切り替えることはもうありません。私はそこにとどまります。

だから、これらの魔法の問題の原因は何でしょうか?

+0

'fruit [0]'は 'View'のタイプですか? –

+0

はい。それはImageViewの –

+0

私の答えを参照してください、それはボタンでテストされています。 –

答えて

2

ポイントが最初 後、あなたがfruit[0].setVisibility(View.VISIBLE);を呼び出す、ということである:

fruit[0].postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         fruit[0].setVisibility(View.INVISIBLE); 
        } 
       }, getRandomDisplayTime()); 

と:

fruit[0].postDelayed(this, getRandomWaitTime()); 

は、同じ時間(すぐに)で、ほとんど実行されます。

たとえば、getRandomDisplayTime()が3000を返し、getRandomWaitTime()が3500を返したとすると、3000ミリ秒後に表示され、500ミリ秒後に再び表示されると、再び消えます。あなたは、このようにコードを変更することができます

fruit[0].postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       final Runnable runnable = this; 
       fruit[0].setVisibility(View.VISIBLE); 
       fruit[0].postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         fruit[0].setVisibility(View.INVISIBLE); 
         fruit[0].postDelayed(runnable, getRandomWaitTime()); 
        } 
       }, getRandomDisplayTime()); 
      } 
     }, getRandomWaitTime()); 
+0

再帰を使用し、すべてが魅力のように機能します! –

2

あなたのコードは少し厄介で、この例を試してみてください。ビュー自体に基づいて、ネストされたpostDelayed()メソッドの代わりに値が選択されます。

fruit[0].postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     fruit[0].setVisibility(backButton.getVisibility() == View.VISIBLE ? View.INVISIBLE : View.VISIBLE); 
     fruit[0].postDelayed(this, backButton.getVisibility() == View.VISIBLE ? getRandomDisplayTime() : getRandomWaitTime()); 
    } 
}, fruit[0].getVisibility() == View.VISIBLE ? getRandomDisplayTime() : getRandomWaitTime()); 
+0

ニースのアプローチ... –

関連する問題